在log4j中配置RollingFileAppender

时间:2011-02-25 13:23:27

标签: java logging 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文件中为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.

我发现有关如何配置此appender的文档有点稀疏,所以任何人都可以帮我修复配置吗?

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

8 个答案:

答案 0 :(得分:58)

我遇到了类似的问题,只是找到了解决问题的方法(单步执行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}位是我在亚马逊EC2上用来区分日志和我所有工作人员的东西 - 我只需要在调用PropertyConfigurator.configure()之前设置该属性,如下所示:

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

答案 1 :(得分:19)

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

  1. 要在类路径中下载并添加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
  4. 以下是适用于我的appender配置:

    <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>
    

答案 2 :(得分:15)

更新:至少早在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'

答案 3 :(得分:4)

Toolbear74是正确的log4j.XML是必需的。 为了让XML验证<param>标签需要在<rollingPolicy>之前 我建议设置一个记录阈值<param name="threshold" value="info"/>

创建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中,看看会发生什么。

答案 4 :(得分: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. 检查您使用的其他第三方罐子是否包含旧版本的log4j.jar。 如果是这样,请确保您的log4j.jar在包含旧log4j.jar的第三方之前的顺序中排在第一位。

答案 5 :(得分:2)

在Log4j2中,“extras”lib不再是必需的。配置格式也发生了变化。

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

答案 6 :(得分:0)

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

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

尝试将其遗漏,看看会发生什么。

答案 7 :(得分:-1)

您的包裹名称不正确

org.apache.log4j.rolling.RollingFileAppender 

正确的是:

org.apache.log4j.RollingFileAppender