动态更改Log4j文件名

时间:2015-02-02 15:36:02

标签: java logging log4j log4j2

我正在我的项目中实现Log4j。我想将每个n(例如10个)日志条目记录到新文件中。我尝试使用' RollingFileAppender'但我认为它只会根据大小和时间更改日志文件。

到目前为止,我做了以下代码:

log4j.properties

log4j.logger.ControlTable=debug, controlTable
log4j.additivity.ControlTable = false
log4j.appender.controlTable=org.apache.log4j.RollingFileAppender
log4j.appender.controlTable.File=${log4jfilename}
log4j.appender.controlTable.MaxFileSize=10MB
log4j.appender.controlTable.MaxBackupIndex=10
log4j.appender.controlTable.layout=org.apache.log4j.PatternLayout

主要

public class ControlTableLoggerConsumer {
static {
    System.setProperty("log4jfilename","d:\\control_log_1_9.json");
}
private static final Logger log = Logger.getLogger("ControlTable");
private static long logEntries = 0;
public static void main(String args[]) {
      System.out.println("Curr log file:"+logEntries+"::"+System.getProperty("log4jfilename"));
      log.info("Log entry:"+logEntries);
      logEntries++;
      if((logEntries >= 10) && ((logEntries % 10) == 0)) {
         System.out.println("going to change file name to "+"d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
         System.setProperty("log4jfilename","d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json");
      }
      if(logEntries == 1000)
         break;
}

在控制台上我可以看到每10个条目的文件名都在变化,但是在我的D盘中我只能看到一个包含所有日志信息的文件。

2 个答案:

答案 0 :(得分:1)

最后我解决了这个问题如下。

Properties props = new Properties(); 
    try { 
        InputStream configStream = getClass().getResourceAsStream("/log4j.properties"); 
        props.load(configStream); 
        configStream.close(); 
    } catch (IOException e) { 
        System.out.println("Errornot laod configuration file "); 
    } 
    props.setProperty("log4j.appender.controlTable.File", logFile); 
    LogManager.resetConfiguration(); 
    PropertyConfigurator.configure(props);

现在我可以动态登录到不同的文件。希望它也有助于其他人。

答案 1 :(得分:0)

您的解决方案对我来说似乎不是一个很好的解决方案,因为:

  1. Appender对您的日志记录代码不再透明
  2. 如果你要登录不同的地方会变得非常混乱,你需要找到一个共同的地方来存储logEntries
  3. 考虑编写自定义Appender(我打赌你可以大部分复制RollingFileAppender内的内容,但只是将触发条件从文件大小更改为写入的记录数。

    简要介绍RollingFileAppender。似乎您可以从中扩展,并覆盖subAppend()方法。

    public class RowCountRollingFileAppender extends FileAppender {
        // constructors
        // getter setters
        private maxEntries = 10;      // provided through config
    
        private currentEntries = 0;
    
        public void rollOver() {
            currentEntries = 0;
            super.rollOver();
        }
        protected void subAppend(LoggingEvent event) {
             super.subAppend(event);
             currentEntries++;
             if (fileName != null 
                     && qw != null 
                     && currentEntries > maxEntries) {
                 rollOver();
             }
        }
    }
    

    然后,如果任一文件达到最大大小,或者记录了n条消息,则可以使用一个将翻转的appender。