tomcat - Tomcat 7 上的 Grails 应用程序 : log4 daily log is overriting old backup logs

标签 tomcat grails log4j rollingfileappender

我正在开发一个以前托管在 JBoss 上的 grails 应用程序,但现在我们已经迁移到 Apache Tomcat。

JBoss 上使用 log4j 的 Grails 应用程序运行完美,但我们面临 org.apache.log4j.DailyRollingFileAppender 的问题,因为我们在 Apache Tomcat 中使用 log4j 进行应用程序日志记录和服务器日志记录.

问题是 org.apache.log4j.DailyRollingFileAppender 会覆盖旧的备份日志文件(例如,我们在日期 8 的日志中获取日期 9 的日志,但找不到 8 的日志),有时它开始记录前一天的备份文件。

我不知道这个 appender 有什么问题,因为他们在 JBoss 上编写了 org.jboss.logging.appender.DailyRollingFileAppender 包装器。 org.apache.log4j.DailyRollingFileAppender 有问题吗?您能提出一个解决方案吗?

<appender class="org.apache.log4j.DailyRollingFileAppender" name="FILE">
    <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
<param name="Threshold" value="INFO"/> 
<param name="File" value="${catalina.base}/logs/applog.log"/>
 <param name="Append" value="true"/>
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS Z} level=%-5p class=%c %X{uniqueId} %X{hostname} %X{requestURI} %X{clientIP} %X{userId} %X{realmId} %X{sessionId} %X{locale} %X{callingHost} %X{uniqueIdCallingHost} %X{asyncUserId} %X{isAsync} %X{taskId} %m%n"/>
      </layout>
   </appender>

因为这不起作用,我们使用 org.apache.log4j.rolling.RollingFileAppender 使用 log4j 的“extras”库。下面是 appender 配置,但它仍然无法正常工作。

<appender name="ROLL" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="File" value="${catalina.base}/logs/paymentRolling.log" />
    <param name="Threshold" value="INFO"/> 
    <param name="Append" value="true"/>
   <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="FileNamePattern" value="${catalina.base}/logs/appRolling.log.%d{yyyy-MM-dd}"/>
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS Z} level=%-5p class=%c %X{uniqueId} %X{hostname} %X{requestURI} %X{clientIP} %X{userId} %X{realmId} %X{sessionId} %X{locale} %X{callingHost} %X{uniqueIdCallingHost} %X{asyncUserId} %X{isAsync} %X{taskId} %m%n"/>
    </layout>
  </appender>

最佳答案

我不确定 XML 配置如何影响一切,但它看起来与我们的(基于属性的)配置非常相似,它的工作方式完全符合我们的预期:

This is our log4j configuration and it works exactly as we expect it to:
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.file = /path/to/logs/log4j.log
# Roll-over the log once a day
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.conversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.A1.append = true

有几件事可能会干扰您的日志记录:

  1. 如果您同时将 log4j 用于服务器日志记录和 webapp 日志记录,您可能会让服务器和各个 webapps 写入相同的文件。也就是说,这两个记录器可能会踩到对方的脚趾。确保每个 log4j 配置(服务器、每个 webapp)都写入完全独立的文件。

  2. 如果系统时间(特别是时区)与 Tomcat 进程和/或查看日志文件的用户的时间不同,您可能会发现日志文件在意外时间翻转。例如,我住在华盛顿特区,目前是 UTC-04:00。如果 Tomcat 用户的时区设置为 UTC,但我的 shell 帐户配置为显示我的本地时间,那么日志文件将显示为每天 20:00 而不是 00:00。不过,在这种情况下,日志条目应全部采用 UTC,因此日志文件的内容不应混淆。

关于tomcat - Tomcat 7 上的 Grails 应用程序 : log4 daily log is overriting old backup logs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11902049/

相关文章:

hibernate - 如何使用最新的库(Spring 3,Hibernate 4,Maven 3)实现独立的GORM?

hadoop - 在 Oozie 工作流的 Pig Action 中传递 JVM 选项以指向 log4j.properties 文件

grails - Grails log4j版本与第三方Java API发生冲突

grails - 从 src/groovy 中访问服务

java - 在 Snow Leopard 上集成 Tomcat7 和 Eclipse Helios

tomcat 6 需要很长时间才能关机

java - Tomcat 8 类加载 - [WEB-INF/lib] 和 [tomcat/lib] 中 JAR 的区别

plugins - Grails:如何引用位于已安装插件中的资源?

java - 我可以让 Log4J 暂时禁止记录特定消息吗?

java - Servlet 不初始化