Log4j记录在错误的文件中滚动(在当天之前,跳过周结束)

时间:2015-07-20 10:35:25

标签: java tomcat logging

我正在使用log4j-1.2.16.jar或我的项目 这是我的log4j.properties

# The default root appender - used to log service calls to console
log4j.rootLogger=INFO, LOGGER1, LOGGER2
#LOGGER1 is set to be a ConsoleAppender which outputs to System.out.
log4j.appender.LOGGER1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGGER1.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGGER1.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGGER1.layout.ConversionPattern=[%d] %p [%X{USER_EMAIL}] %t %c - %m%n
log4j.appender.LOGGER1.File=D:/DevLogs/logger1.log
log4j.appender.LOGGER1.Threshold = ERROR

# An extra category to a log API Calls to a file
log4j.appender.LOGGER2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOGGER2.DatePattern='.'yyyy-MM-dd
log4j.appender.LOGGER2.File=D:/DevLogs/logger2.log
log4j.appender.LOGGER2.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGGER2.layout.ConversionPattern= [%d] %p [%X{USER_EMAIL}] %t %c - %m%n
log4j.appender.LOGGER2.Threshold = INFO

以前,我有两个tomcat服务器用于两个不同的应用程序,其中包含两个log4j.properties和正确创建的日志。现在我只有一个tomcat服务器,我们在单个战争中合并了这两个应用程序战争。但是有几个服务取决于这个应用程序,我们需要为一个版本提供向后兼容性。所以我们在tomcat上只有一个war文件,但通过改变server.xml中的配置,我们用来创建两个不同的上下文。以下是我server.xml

的摘录
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" server="Not Available"  maxThreads="1500"/>
<Connector port="8280" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" server="Not Available"  maxThreads="1500"/>

<Context docBase="application.war" path="/firstApplication" reloadable="true" />
<Context docBase="application.war" path="/secondApplication" reloadable="true" />

应用程序正常运行。但我的日志在错误的文件中滚动。例如,今天是7月2日,所以直到下午,日志工作正常,但在7月2日之后日志开始在一天之前开始打印,即7月1日文件。另一个复杂的是这个过程跳过周末。星期六和星期日的手段,日志很好,但星期一,日志在星期五的日志文件中移动。 我完全是空白,出了什么问题。相同的配置文件适用于两个不同的服务器,但存在两个逻辑上下文的问题。如果有人有任何建议,请告诉我。

1 个答案:

答案 0 :(得分:0)

这听起来好像你在具有相同日志配置的容器中有两个应用程序(上下文) - 它们将相互踩 - 几乎可以保证。

这可以解释为什么您的日志滚动行为如此不稳定。

没有简单/容易的解决方法。您可以选择外部滚动机制,例如logrotate(如果您在unix系统上托管)作为选项。

你或许可以利用logback + slf4j的组合来实现这个目标。 Slf4j为插件重新路由库提供了一个插件,用于破坏基于log4j的日志记录。我已经使用它在应用程序中用logback + slf4j替换log4j,并设法确保依赖库(针对log4j编写)仍能正常运行。

此外,您可以使用logback的context selector来确定日志文件的轮换时间。

如果不提供单独的应用程序部署,您的log4j配置将在两个应用程序之间发生冲突,从而导致您看到的行为。

编辑根据OP的问题/评论,以下内容应提供完成基于上下文的选择的方法。

关于您的情况,它是在两个上下文中部署的一个应用程序,请尝试从server.xml执行以下操作。它将为部署的上下文提供JNDI树的Environment条目。

<Context docBase="application.war" path="/firstApplication" reloadable="true">
    <Environment name="logback/context-name" value="firstApplication" type="java.lang.String" />
</Context>
<Context docBase="application.war" path="/secondApplication" reloadable="true">
    <Environment name="logback/context-name" value="secondApplication" type="java.lang.String" />
</Context>

此时,您应该能够根据上下文选择器遵循文档。