首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用<rollingPolicy>和<triggeringPolicy>进行log4j.xml配置

使用<rollingPolicy>和<triggeringPolicy>进行log4j.xml配置
EN

Stack Overflow用户
提问于 2011-01-16 22:43:50
回答 2查看 14.2K关注 0票数 7

我尝试以这样一种方式配置log4j.xml,即根据文件大小滚动文件,并将滚动文件的名称命名为:"C:/temp/test/test_log4j-%d{yyyy-MM-dd-HH_mm_ss}.log“。我遵循下面的讨论:http://web.archiveorange.com/archive/v/NUYyjJipzkDOS3reRiMz

最后,只有当我添加以下内容时,它才对我起作用:

代码语言:javascript
复制
try {
   Thread.sleep(1);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }

对于该方法:

代码语言:javascript
复制
public boolean isTriggeringEvent(Appender appender, LoggingEvent event,
            String filename, long fileLength)  

才能让它工作。

问题是,是否有更好的方法让它工作?因为这个方法会调用很多次,会减慢我程序速度。

代码如下:

代码语言:javascript
复制
package com.mypack.rolling;

import org.apache.log4j.rolling.RollingPolicy;
import org.apache.log4j.rolling.RolloverDescription;
import org.apache.log4j.rolling.TimeBasedRollingPolicy;

/**
 * Same as org.apache.log4j.rolling.TimeBasedRollingPolicy but acts only as
 * RollingPolicy and NOT as TriggeringPolicy.
 *
 * This allows us to combine this class with a size-based triggering policy
 * (decision to roll based on size, name of rolled files based on time)
 *
 */
public class CustomTimeBasedRollingPolicy implements RollingPolicy {

 TimeBasedRollingPolicy timeBasedRollingPolicy = new TimeBasedRollingPolicy();

 /**
  * Set file name pattern.
  * @param fnp file name pattern.
  */
 public void setFileNamePattern(String fnp) {
  timeBasedRollingPolicy.setFileNamePattern(fnp);
 }
 /*
 public void setActiveFileName(String fnp) {
  timeBasedRollingPolicy.setActiveFileName(fnp);
 }*/

 /**
  * Get file name pattern.
  * @return file name pattern.
  */
 public String getFileNamePattern() {
  return timeBasedRollingPolicy.getFileNamePattern();
 }

 public RolloverDescription initialize(String file, boolean append) throws SecurityException {
  return timeBasedRollingPolicy.initialize(file, append);
 }

 public RolloverDescription rollover(String activeFile) throws SecurityException {
  return timeBasedRollingPolicy.rollover(activeFile);
 }

 public void activateOptions() {
  timeBasedRollingPolicy.activateOptions();
 }
}



package com.mypack.rolling;

import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.Appender;
import org.apache.log4j.rolling.TriggeringPolicy;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.OptionHandler;

/**
 * Copy of org.apache.log4j.rolling.SizeBasedTriggeringPolicy but able to accept
 * a human-friendly value for maximumFileSize, eg. "10MB"
 * 
 * Note that sub-classing SizeBasedTriggeringPolicy is not possible because that
 * class is final
 */
public class CustomSizeBasedTriggeringPolicy implements TriggeringPolicy, OptionHandler {

 /**
  * Rollover threshold size in bytes.
  */
 private long maximumFileSize = 10 * 1024 * 1024; // let 10 MB the default max size

 /**
  * Set the maximum size that the output file is allowed to reach before
  * being rolled over to backup files.
  * 
  * <p>
  * In configuration files, the <b>MaxFileSize</b> option takes an long
  * integer in the range 0 - 2^63. You can specify the value with the
  * suffixes "KB", "MB" or "GB" so that the integer is interpreted being
  * expressed respectively in kilobytes, megabytes or gigabytes. For example,
  * the value "10KB" will be interpreted as 10240.
  * 
  * @param value
  *            the maximum size that the output file is allowed to reach
  */
 public void setMaxFileSize(String value) {
  maximumFileSize = OptionConverter.toFileSize(value, maximumFileSize + 1);
 }

 public long getMaximumFileSize() {
  return maximumFileSize;
 }

 public void setMaximumFileSize(long maximumFileSize) {
  this.maximumFileSize = maximumFileSize;
 }

 public void activateOptions() {
 }

 public boolean isTriggeringEvent(Appender appender, LoggingEvent event,
            String filename, long fileLength) {
  try {
   Thread.sleep(1);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }

  boolean result = (fileLength >= maximumFileSize);

  return result;
 }

}

和log4j.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
 <appender name="console" class="org.apache.log4j.ConsoleAppender">
  <param name="Target" value="System.out" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d [%t] %-5p %c -> %m%n" />
  </layout>
 </appender>

 <appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
  <param name="file" value="C:/temp/test/test_log4j.log" />
  <rollingPolicy class="com.mypack.rolling.CustomTimeBasedRollingPolicy">
   <param name="fileNamePattern" value="C:/temp/test/test_log4j-%d{yyyy-MM-dd-HH_mm_ss}.log" />
  </rollingPolicy>
  <triggeringPolicy class="com.mypack.rolling.CustomSizeBasedTriggeringPolicy">
   <param name="MaxFileSize" value="200KB" />
  </triggeringPolicy>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d [%t] %-5p %c -> %m%n" />
  </layout>
 </appender>

 <logger name="com.mypack.myrun" additivity="false">
  <level value="debug" />
  <appender-ref ref="FILE" />
 </logger>

 <root>
  <priority value="debug" />
  <appender-ref ref="console" />
 </root>

</log4j:configuration>
EN

Stack Overflow用户

发布于 2011-01-17 00:47:19

如果将调试输出添加到该方法中,您将看到该方法被频繁调用,即使在触发器已经激发之后也是如此,但文件大小仍大于最大文件大小。

我假设滚动行为具有某种类型的缓冲区,该缓冲区在实际的(同步?)发生翻转。

我认为这与com.mypack.rolling.CustomTimeBasedRollingPolicy中的fileNamePattern有关。只要文件名中的“second”没有更改,就会连续调用CustomSizeBasedTriggeringPolicy.isTriggeringEvent方法,其大小大于最大文件大小。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4705957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档