关于Java:在log4j中配置RollingFileAppender

Configuring RollingFileAppender in log4j

我正在开发一套Web服务,我们希望每天都有轮换日志。

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

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

我在log4j.properties文件中对追加程序进行了以下配置:

1
2
3
4
5
6
7
8
### 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服务时,出现以下错误消息:

1
2
3
4
5
6
7
8
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-extras源代码,同样如此)。

好消息是,与其他地方所写的不同,事实是您实际上可以使用log4j.properties配置TimeBasedRollingPolicy(不需要XML配置!至少在log4j> 1.2.16的版本中请参见此错误报告)。

这是一个例子:

1
2
3
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

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

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


使这项工作面临更多的问题。详细信息如下:

  • 要在类路径中下载并添加apache-log4j-extras-1.1.jar,一开始并没有注意到这一点。
  • RollingFileAppender应该是org.apache.log4j.rolling.RollingFileAppender而不是org.apache.log4j.RollingFileAppender。这可能会导致错误:log4j:ERROR No output stream or file set for the appender named .
  • 我们必须将log4j库从log4j-1.2.14.jar升级到log4j-1.2.16.jar
  • 以下是对我有用的Appender配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            <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>


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

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

    Note that TimeBasedRollingPolicy can only be configured with xml, not log4j.properties

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

    1
    2
    3
    4
    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'


    Toolbear74是正确的log4j.XML是必需的。
    为了使XML验证标记,必须在之前
    我建议设置日志记录阈值

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

    这是一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="windows-1252"?>
    <!DOCTYPE log4j:configuration SYSTEM"log4j.dtd">
    <log4j:configuration>
    <!-- Daily Rolling File Appender that compresses old files -->
     
         <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>
       
      </root>
    </log4j:configuration>

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

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


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

  • 使用比log4j-1.2.14.jar更新的log4j.jar版本,该版本具有定义rollingPolicylog4j.dtd
  • 当然,您还需要apache-log4j-extras-1.1.jar
  • 检查您正在使用的其他第三方jar是否可能装有旧版本的log4j.jar。
    如果是这样,请确保您的log4j.jar在包含较旧log4j.jar的第三方之前排在第一位。

  • 在Log4j2中," extras"库不再是必需的。配置格式也已更改。

    Apache文档中提供了一个示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

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

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

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


    您的包裹名称不正确

    1
    org.apache.log4j.rolling.RollingFileAppender

    正确的是:

    1
    org.apache.log4j.RollingFileAppender