我最近在Java Web服务应用程序中更新了log4j,从v1.2升级到v2.6.2;该应用程序托管在Tomcat 7.0.21上,使用Java 7.0_67-b01;使用Eclipse Juno编译/编译(v4.2.0)。
我在新的lo4j2.xml配置文件中重现了log4j.properties功能。代码示例如下,我试图使用RollingFile appender和File appender以及标准的Console appender。
正在预期位置创建日志文件,但它们仍为空。控制台本身正在记录我的应用程序抛出的所有消息; catalina。 yyyy-mm-dd .log文件正在记录Info级别和更高级别。如上所述,创建了tearLog.log和tearsLogRF.log文件,但根本没有写入日志消息。
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Properties>
<Property name="log-path">${sys:catalina.home}/logs</Property>
</Properties>
<Appenders>
<Console name="Console"
target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" />
</Console>
<File name="MyFile"
append="true" immediateFlush="true"
fileName="${log-path}/tearsLog.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" />
</File>
<RollingFile name="MyRollingFile"
append="true" immediateFlush="true"
fileName="${log-path}/tearsLogRF.log"
filePattern="${log-path}/tearsLogRF_%d{yyyy-MM-dd_HH-mm-ss}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 KB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="us.ak.state.adfg.tears.service.TearsService" level="info" additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile" level="trace" />
<AppenderRef ref="MyRollingFile" />
</Logger>
<Logger name="us.ak.state.adfg.tears.data.GenericDao" level="info" additivity="false">
<AppenderRef ref="MyFile" level="trace" />
<AppenderRef ref="MyRollingFile" />
</Logger>
<Logger name="us.ak.state.adfg.tears.data.EmployeeDao" level="info" additivity="false">
<AppenderRef ref="MyFile" level="trace" />
<AppenderRef ref="MyRollingFile" />
</Logger>
<Logger name="us.ak.state.adfg.tears.data.TimesheetDao" level="info" additivity="false">
<AppenderRef ref="MyFile" level="trace" />
<AppenderRef ref="MyRollingFile" />
</Logger>
<Logger name="us.ak.state.adfg.tears.data.SecurityDao" level="info" additivity="false">
<AppenderRef ref="MyFile" level="trace" />
<AppenderRef ref="MyRollingFile" />
</Logger>
<Root level="debug">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile" level="trace" additivity="false" />
<AppenderRef ref="MyRollingFile" additivity="false" />
</Root>
</Loggers>
</Configuration>
示例* .java类:
package us.ak.state.adfg.tears.service;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TearsService {
static Logger log = LogManager.getLogger(TearsService.class);
public TearsService() {
}
public int saveTimesheet(User user, Timesheet ts) throws Exception {
String msg = "";
if (user == null) {
msg = "Null user.";
log.error(msg);
throw new Exception(msg);
}
...
return 0;
}
我已经离开了,看了很多很多代码示例,Apache log4j文档和SO问题/答案,使用了示例代码和建议......无法弄清楚错误是什么。我知道它很接近,只是一些小问题让我无法继续前进。会感激一些帮助。提前谢谢......
答案 0 :(得分:2)
您看到的控制台上的消息可能是由tomcat发布的。如果您只运行此示例代码,则可以在日志中没有任何内容 - 唯一的日志是在出错时完成的。更改您的代码:
public int saveTimesheet(User user, Timesheet ts) throws Exception {
String msg = "";
log.info("Message:{}",msg);
if (user == null) {
msg = "Null user.";
log.error(msg);
throw new Exception(msg);
}
...
return 0;
}
顺便说一句,你不应该为每个类定义一个记录器,它足以成为所有事物的通用记录器:
<Loggers>
<root level="debug">
...
</root>
<Logger name="us.ak.state.adfg.tears" level="info" additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile" level="trace"/>
<AppenderRef ref="MyRollingFile" />
</Logger>
</Loggers>
答案 1 :(得分:0)
最终,重新启动Tomcat服务器神奇地解决了这个问题。奇怪的是必要的,代码和log4j模块都是自包含在应用程序中,我认为只是重新部署应用程序会使它工作(它创建文件)?无论如何,它现在似乎正在发挥作用。