这是一个我已经成功使用的 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
日志文件中的每个条目都将采用以下格式:
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()
使用-Dlog4j.configuration设置上述文件的位置,如this posting中所述:
java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
在您的 Java 代码中,当您实例化您的记录器对象时,请务必设置每个软件组件的名称。我也喜欢同时记录到日志文件和标准输出,所以我写了这个小函数。
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)));