【问题标题】:Configuring RollingFileAppender in log4j在 log4j 中配置 RollingFileAppender
【发布时间】:2011-07-04 07:36:14
【问题描述】:

我正在开发一组网络服务,我们希望有一个每日轮换日志。

我正在尝试从 log4j extras 同伴工作中获取 org.apache.log4j.rolling.RollingFileAppender,因为文档表明这最适合生产环境。

我在类路径上有主 log4J 库 (log4j-1.2.15.jar) 和 log4j extras 库 (apache-log4j-extras-1.1.jar)。

log4j.properties 文件中的 appender 有以下配置:

### SOAP Request Appender
log4j.appender.request=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.request.File=SOAPmessages.log
log4j.appender.request.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.request.RollingPolicy.ActiveFileName =SOAPmessages-%d.log
log4j.appender.request.RollingPolicy.FileNamePattern=SOAPmessages-%d.log.zip
log4j.appender.request.layout = org.apache.log4j.PatternLayout
log4j.appender.request.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

但是,当我在调试模式下使用 log4j 启​​动 Web 服务时,我收到以下错误消息:

log4j: Parsing appender named "request".
log4j: Parsing layout options for "request".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "request".
log4j: Setting property [file] to [/logs/SOAPmessages.log].
log4j:WARN Failed to set property [rollingPolicy] to value "org.apache.log4j.rolling.TimeBasedRollingPolicy". 
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'request'
log4j: Parsed "request" options.

我发现有关如何配置此附加程序的文档有点少,所以谁能帮我修复我的配置?

EDIT0:添加了调试模式输出,而不仅仅是标准警告

【问题讨论】:

  • 为了解决这个问题,我想你可以尝试打开Log4j调试模式,看看有没有更详细的错误信息
  • 不是一个答案,只是一个建议。你真的应该看看logback。它比 log4j 灵活得多。
  • 仅供参考:此问题已在 log4j v1.2.16 中修复。它现在支持通过属性文件设置 rollingPolicy。 issues.apache.org/bugzilla/show_bug.cgi?id=36384

标签: java logging log4j


【解决方案1】:

更新:至少早在 2013 年(请参阅 Mubashar 的评论),它就开始起作用了。


根据Log4jXmlFormat,您不能使用 log4j.properties 进行配置,只能使用 XML 配置格式:

注意TimeBasedRollingPolicy只能用xml配置,不能用log4j.properties

不幸的是,他们提供的示例 log4j.xml 也不起作用:

log4j:ERROR Parsing error on line 14 and column 76
log4j:ERROR Element type "rollingPolicy" must be declared.
...
log4j:WARN Please set a rolling policy for the RollingFileAppender named 'FILE'

【讨论】:

  • 我明白了,在我阅读的任何文档中都没有注意到这一点,也没有注意到任何对 wiki 有帮助的链接。感谢您指出 +1
  • 这在您回答的日期可能是正确的,但它与 log4j.properties 文件一起工作正常,至少对我来说
  • 有一个来自 apache 的“log4j-extras”包,您可以在其中找到定义的“rollingPolicy”。它会解决你的许多问题
  • @toolbear :我不敢苟同,因为我使用的是 log4j.properties,它工作正常。是不是他们后来加了支持。
  • @SagarKharab 答案已过时。在 2011 年它没有工作。早在 2013 年(见 Mubashar 的评论)它就奏效了。我已更新我的答案以表明这一点。
【解决方案2】:

在 Log4j2 中,“附加”库不再是强制性的。配置格式也发生了变化。

Apache documentation中提供了一个例子

property.filename = /foo/bar/test.log

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /foo/bar/rolling/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5


logger.rolling.name = com.example.my.class
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile

【讨论】:

    【解决方案3】:

    关于错误:log4j:ERROR Element type "rollingPolicy" must be declared

    1. 使用比 log4j-1.2.14.jar 更新的 log4j.jar 版本,它有一个 log4j.dtd 定义 rollingPolicy
    2. 当然你还需要apache-log4j-extras-1.1.jar
    3. 检查您使用的任何其他第三方 jar 中是否包含旧版本的 log4j.jar。 如果是这样,请确保您的 log4j.jar 在包含旧 log4j.jar 的第三方之前的顺序排在第一位。

    【讨论】:

      【解决方案4】:

      在完成这项工作时遇到了更多问题。以下是详细信息:

      1. 下载并在classpath中添加apache-log4j-extras-1.1.jar,一开始没有注意到这个。
      2. RollingFileAppender 应该是 org.apache.log4j.rolling.RollingFileAppender 而不是 org.apache.log4j.RollingFileAppender。这可能会出现错误:log4j:ERROR No output stream or file set for the appender named [file].
      3. 我们不得不将 log4j 库从 log4j-1.2.14.jar 升级到 log4j-1.2.16.jar

      以下是对我有用的附加程序配置:

      <appender name="file" class="org.apache.log4j.rolling.RollingFileAppender">
              <param name="threshold" value="debug" />
              <rollingPolicy name="file"
                  class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
                  <param name="FileNamePattern" value="logs/MyLog-%d{yyyy-MM-dd-HH-mm}.log.gz" />
                  <!-- The below param will keep the live update file in a different location-->
                  <!-- param name="ActiveFileName" value="current/MyLog.log" /-->
              </rollingPolicy>
      
              <layout class="org.apache.log4j.PatternLayout">
                  <param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
              </layout>
      </appender>
      

      【讨论】:

      • 谢谢你。不知何故,对 o.a.log4j.RFAppender 和 o.a.log4j.rolling.RFAppender 之间的区别完全视而不见。需要有人指出显而易见的事情。
      • 我有 log4j-1.2.17.jar 但它没有以下包 org.apache.log4j.rolling.RollingFileAppender
      • @yatinbc,获取 log4j extras 包。
      【解决方案5】:

      我有一个类似的问题,只是找到了解决它的方法(通过单步浏览log4j-extras 源,不少于......)

      好消息是,与随处可见的内容不同,事实证明,您实际上可以使用 log4j.properties 配置 TimeBasedRollingPolicy(不需要 XML 配置!至少在 log4j >1.2.16 的版本中)看到这个bug report)

      这是一个例子:

      log4j.appender.File = org.apache.log4j.rolling.RollingFileAppender
      log4j.appender.File.rollingPolicy = org.apache.log4j.rolling.TimeBasedRollingPolicy
      log4j.appender.File.rollingPolicy.FileNamePattern = logs/worker-${instanceId}.%d{yyyyMMdd-HHmm}.log
      

      顺便说一句,${instanceId} 位是我在 Amazon 的 EC2 上用来区分日志和所有工作人员的东西——我只需要在调用 PropertyConfigurator.configure() 之前设置该属性,如下所示:

      p.setProperty("instanceId", EC2Util.getMyInstanceId());
      PropertyConfigurator.configure(p);
      

      【讨论】:

      • 最近,我创建了一个patch 以允许配置递归目录。例如,您可以将每日压缩日志文件存储在每月子目录中,如下所示:log4j.appender.File.rollingPolicy.FileNamePattern=Logs/%d{yyyyMM}/ServerLog_%d{yyyyMMdd}.log.zip。 log4j 会在需要时正确创建所需的目录。
      【解决方案6】:

      你的包名不好

      org.apache.log4j.rolling.RollingFileAppender 
      

      正确的是:

      org.apache.log4j.RollingFileAppender 
      

      【讨论】:

      • 实际上,两者都是有效的包名。一个是 main log4j library 中 RollingFileAppender 的实现,而另一个是 log4j extras library 中的实现,它提供了多种替代过滤器和附加程序。 main 包中的实现特别推荐使用 extras 实现。
      【解决方案7】:

      Toolbear74 是对的 log4j.XML 是必需的。 为了让 XML 验证 &lt;param&gt; 标签需要在 &lt;rollingPolicy&gt; 之前 我建议设置一个日志记录阈值&lt;param name="threshold" value="info"/&gt;

      创建 Log4j.xml 文件时不要忘记将 log4j.dtd 复制到相同位置。

      这是一个例子:

      <?xml version="1.0" encoding="windows-1252"?>
      <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
      <log4j:configuration>
      <!-- Daily Rolling File Appender that compresses old files -->
        <appender name="file" class="org.apache.log4j.rolling.RollingFileAppender" >
           <param name="threshold" value="info"/>
           <rollingPolicy name="file"  
                            class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
              <param name="FileNamePattern" 
                     value="${catalina.base}/logs/myapp.log.%d{yyyy-MM-dd}.gz"/>
              <param name="ActiveFileName" value="${catalina.base}/logs/myapp.log"/>
           </rollingPolicy>
           <layout class="org.apache.log4j.EnhancedPatternLayout" >
              <param name="ConversionPattern" 
                     value="%d{ISO8601} %-5p - %-26.26c{1} - %m%n" />
          </layout>
        </appender>
      
        <root>
          <priority value="debug"></priority>
          <appender-ref ref="file" />
        </root>
      </log4j:configuration>
      

      考虑到您设置 FileNamePatternActiveFileName 我认为设置 File 属性是多余的,甚至可能是错误的

      尝试重命名您的 log4j.properties 并放入类似于我的示例的 log4j.xml,看看会发生什么。

      【讨论】:

      • 是的,需要使用 XML +1 配置
      • 我宁愿在类路径中添加一个额外的库而不是使用 XML 来完成这项任务,因为我已经有很多属性样式的配置,所以重写所有只是因为一个附加程序不合逻辑
      【解决方案8】:

      我怀疑 ActiveFileName 属性。根据 log4j javadoc,TimeBasedRollingPolicy 类上没有这样的属性。 (没有setActiveFileNamegetActiveFileName 方法。)

      我不知道指定未知属性会做什么,但它可能会导致包含对象被放弃,这可能会导致您看到的警告。

      试着忽略它,看看会发生什么。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多