Configuring RollingFileAppender in log4j

前端 未结 8 1318
谎友^
谎友^ 2020-12-01 01:43

I\'m working on a set of web services and we\'d like to have a daily rotated log.

I\'m trying to get org.apache.log4j.rolling.RollingFileAppender from t

相关标签:
8条回答
  • 2020-12-01 02:23

    In Log4j2, the "extras" lib is not mandatory any more. Also the configuration format has changed.

    An example is provided in the 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
    
    0 讨论(0)
  • 2020-12-01 02:25

    Toolbear74 is right log4j.XML is required. In order to get the XML to validate the <param> tags need to be BEFORE the <rollingPolicy> I suggest setting a logging threshold <param name="threshold" value="info"/>

    When Creating a Log4j.xml file don't forget to to copy the log4j.dtd into the same location.

    Here is an example:

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

    Considering that your setting a FileNamePattern and an ActiveFileName I think that setting a File property is redundant and possibly even erroneous

    Try renaming your log4j.properties and dropping in a log4j.xml similar to my example and see what happens.

    0 讨论(0)
  • 2020-12-01 02:25

    Regarding error: log4j:ERROR Element type "rollingPolicy" must be declared

    1. Use a log4j.jar version newer than log4j-1.2.14.jar, which has a log4j.dtd defining rollingPolicy.
    2. of course you also need apache-log4j-extras-1.1.jar
    3. Check if any other third party jars you are using perhaps have an older version of log4j.jar packed inside. If so, make sure your log4j.jar comes first in the order before the third party containing the older log4j.jar.
    0 讨论(0)
  • 2020-12-01 02:33

    I had a similar problem and just found a way to solve it (by single-stepping through log4j-extras source, no less...)

    The good news is that, unlike what's written everywhere, it turns out that you actually CAN configure TimeBasedRollingPolicy using log4j.properties (XML config not needed! At least in versions of log4j >1.2.16 see this bug report)

    Here is an example:

    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
    

    BTW the ${instanceId} bit is something I am using on Amazon's EC2 to distinguish the logs from all my workers -- I just need to set that property before calling PropertyConfigurator.configure(), as follow:

    p.setProperty("instanceId", EC2Util.getMyInstanceId());
    PropertyConfigurator.configure(p);
    
    0 讨论(0)
  • 2020-12-01 02:35

    I'm suspicious of the ActiveFileName property. According to the log4j javadoc, there isn't such a property on the TimeBasedRollingPolicy class. (No setActiveFileName or getActiveFileName methods.)

    I don't know what specifying an unknown property would do, but it is possible that it will cause the containing object to be abandoned, and that could lead to the warnings that you saw.

    Try leaving it out and seeing what happens.

    0 讨论(0)
  • 2020-12-01 02:42

    Update: at least as early as 2013 (see Mubashar's comment) this started working.


    According to Log4jXmlFormat you cannot configure it with log4j.properties, but only using the XML config format:

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

    Unfortunately, the example log4j.xml they provide doesn't work either:

    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'
    
    0 讨论(0)
提交回复
热议问题