在log4j中configurationRollingFileAppender

我正在研究一组Web服务,我们希望每天都有一个轮换的日志。

我试图从log4j额外的同伴工作,以获得org.apache.log4j.rolling.RollingFileAppender ,因为文档build议这是最适合生产环境。

我在类path上同时具有主要的log4J库( log4j-1.2.15.jar )和log4j额外的库( apache-log4j-extras-1.1.jar )。

我在log4j.properties文件中为appenderconfiguration了以下configuration:

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

但是,当我在debugging模式下使用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. 

我发现有关如何configuration这个appender有点稀疏的文档,所以任何人都可以帮助我解决我的configuration?

EDIT0:增加了debugging模式输出,而不仅仅是标准的警告

根据Log4jXmlFormat,您不能使用log4j.propertiesconfiguration它,只能使用XMLconfiguration格式:

请注意,TimeBasedRollingPolicy只能使用xml进行configuration,而不能使用log4j.properties进行configuration

不幸的是,他们提供的例子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' 

我有一个类似的问题,只是find了解决这个问题的方法(通过单步执行log4j-extras源代码,不less于…)

好消息是,不像什么地方写的,事实certificate, 你实际上可以使用log4j.properties configurationTimeBasedRollingPolicy (XMLconfiguration不需要!至less在版本的log4j> 1.2.16看到这个错误报告 )

这里是一个例子:

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

面对更多的问题,同时使这项工作。 以下是详细信息:

  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的configuration,这对我有效:

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

Toolbear74是正确的log4j.XML是必需的。 为了让XMLvalidation<param>标签需要在<rollingPolicy>之前build议设置一个日志阈值<param name="threshold" value="info"/>

创buildLog4j.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> 

考虑到你设置一个FileNamePattern和一个ActiveFileName我认为设置一个File属性是多余的,甚至可能是错误的

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

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

  1. 使用比log4j-1.2.14.jar更新的log4j.jar版本,该版本具有定义rollingPolicy
  2. 当然你也需要apache-log4j-extras-1.1.jar
  3. 检查你正在使用的任何其他第三方jar子是否可能有一个老版本的log4j.jar打包里面。 如果是这样,请确保您的log4j.jar在包含较早的log4j.jar的第三方之前的顺序中排在第一位。

在Log4j2中,“extras”库不再是强制性的。 另外configuration格式已经改变。

Apache文档中提供了一个示例

 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方法。)

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

试着把它留下来,看看会发生什么。

你有一个不好的包名称

 org.apache.log4j.rolling.RollingFileAppender 

正确的是:

 org.apache.log4j.RollingFileAppender