Java Log4j:如何配置最简单的文件日志记录?
我的故事: 我想制作一个尽可能简单的log4j记录器,将行记录到文件中。我发现了几个具有一些功能的示例,但不是一个真正起作用的基本、通用的示例,也没有一个解释了每一行是如何工作的 问题: 有人能提供吗 先决条件:Java Log4j:如何配置最简单的文件日志记录?,java,logging,log4j,Java,Logging,Log4j,我的故事: 我想制作一个尽可能简单的log4j记录器,将行记录到文件中。我发现了几个具有一些功能的示例,但不是一个真正起作用的基本、通用的示例,也没有一个解释了每一行是如何工作的 问题: 有人能提供吗 先决条件: 我已经知道将文件放在哪里,并且已经配置了log4j,并且正在进行控制台日志记录。 现在,我想登录到一个文件,并在程序运行后从文件系统中查找该文件。 需要添加到现有log4j中的行。属性是所需的输出 我为您准备了一个通用log4j.xml文件: <?xml version="1
- 我已经知道将文件放在哪里,并且已经配置了log4j,并且正在进行控制台日志记录。
- 现在,我想登录到一个文件,并在程序运行后从文件系统中查找该文件。
- 需要添加到现有
log4j中的行。属性是所需的输出
我为您准备了一个通用log4j.xml文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">
<appender name="default.console" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="default.file" class="org.apache.log4j.FileAppender">
<param name="file" value="/log/mylogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<appender name="another.file" class="org.apache.log4j.FileAppender">
<param name="file" value="/log/anotherlogfile.log" />
<param name="append" value="false" />
<param name="threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
</layout>
</appender>
<logger name="com.yourcompany.SomeClass" additivity="false">
<level value="debug" />
<appender-ref ref="another.file" />
</logger>
<root>
<priority value="info" />
<appender-ref ref="default.console" />
<appender-ref ref="default.file" />
</root>
</log4j:configuration>
有关所有布局参数的描述,请参见此处:这里有一个我经常使用的简单参数:
# Set up logging to include a file record of the output
# Note: the file is always created, even if there is
# no actual output.
log4j.rootLogger=error, stdout, R
# Log format to standard out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
# File based log output
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=owls_conditions.log
log4j.appender.R.MaxFileSize=10000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n
日志的格式如下:
ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44)
http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
这种格式由字符串%5p\t[%d][%t](%F:%L)\n\t%m%n\n
定义。您可以在中读取转换字符的含义
包含的注释应有助于理解它的功能。进一步说明:
- 它记录到控制台和文件;在这种情况下,文件名为
:根据需要更改它李>owls\u conditions.log
- 文件达到10000KB时会进行旋转,并保留一个备份文件
- 这是一个log4j.properties文件,我使用它非常成功
logDir=/var/log/myapp
log4j.rootLogger=INFO, stdout
#log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.File=${logDir}/myapp.log
log4j.appender.stdout.append=true
DailyRollingFileAppender每天将创建新文件,文件名如下:
myapp.log.2017-01-27
myapp.log.2017-01-28
myapp.log.2017-01-29
myapp.log <-- today's log
使用-Dlog4j.configuration
设置上述文件的位置,如中所述:
在Java代码中,当实例化logger对象时,请确保设置每个软件组件的名称。我还喜欢记录日志文件和标准输出,所以我编写了这个小函数
private static final Logger LOGGER = Logger.getLogger("Component1");
public static void log(org.apache.log4j.Logger logger, String message) {
logger.info(message);
System.out.printf("%s\n", message);
}
public static String stackTraceToString(Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
}
然后这样称呼它:
LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));
我还要求解释。例如,
default file
appender上的布局参数是做什么的?这是一种输出模式,那些%占位符决定记录什么信息以及如何设置这些信息的格式,看看我稍后将添加到回答中的链接,我几乎有类似的log4j.xml,但我仍然只在控制台中获取日志,而没有写入文件,尽管日志文件正在生成。只是想问一下这里要添加哪些依赖项和jar。我相信我的课堂上有一些矛盾的罐子。此外,为了获得所有类型的日志,比如信息、错误、调试等,在这个级别中应该有什么?在我的例子中,我只需要在类路径中有log4j.jar。除非您在代码和log4j或自定义appender之间使用facades,否则应该足够了。然后将指向代码路径的记录器级别设置为详细的级别,例如debug
、trace
甚至all
。并将文件追加器的threshold
param设置为相同的值。应该授予哪些权限,以便日志真正进入文件。我几乎记不起过去的一些事情,至少对文件的文件权限应该是固定的,可能还有其他一些与程序相关的权限。我是在Linux中制作的。sample.log文件将在哪里创建?我认为这是一个很大的问题。在容器外部,我相信这会将日志文件放在CWD
中,但是如果您在容器中配置日志,容器可能会将其放在其他地方。
myapp.log.2017-01-27
myapp.log.2017-01-28
myapp.log.2017-01-29
myapp.log <-- today's log
01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1
01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar()
java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
private static final Logger LOGGER = Logger.getLogger("Component1");
public static void log(org.apache.log4j.Logger logger, String message) {
logger.info(message);
System.out.printf("%s\n", message);
}
public static String stackTraceToString(Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
}
LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));