【问题标题】:RollingFileAppender set RollingPolicy programmaticallyRollingFileAppender 以编程方式设置 RollingPolicy
【发布时间】:2014-08-28 00:25:46
【问题描述】:

由于我不会进入的原因,我不得不以编程方式配置 log4j appender。

我想使用 RollingFileAppender,这样我就可以控制保留的最大文件数。

我还想将此附加程序设置为使用 TimeBasedRollingPolicy,因为它会自动处理压缩滚动文件。

问题是我看不到通过代码设置它的方法。通过属性文件正常设置 RollingFileAppender 时,您将拥有:

log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy

一定有办法设置这个....?任何人都可以解释一下,通过 javadoc 挖掘,类方法的基本 eclipse-reflection 并没有揭示解决方案:(

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    以下是我如何覆盖 log4j.xml 文件,为名为“TheLoggerName”的记录器设置一个新文件名,该记录器的 RollingFileAppender 名为“TheAppenderName”。您或许可以以此为基础来解决您的问题。

    import org.apache.log4j.Logger;
    import org.apache.log4j.rolling.RollingFileAppender;
    import org.apache.log4j.rolling.TimeBasedRollingPolicy;
    
    ...
    
    private static void afunction(String pTheNewFileName) {
    
    Logger logger = Logger.getLogger("TheLoggerName");
    RollingFileAppender rfappender = (RollingFileAppender) logger.getAppender("TheAppenderName");
    TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) rfappender.getRollingPolicy();
    timeBasedRollingPolicy.setFileNamePattern("newfilename%d{yyyy-MM}");
    timeBasedRollingPolicy.activateOptions();
    rfappender.activateOptions();
    }
    

    【讨论】:

    • 谢谢,这有帮助。不过需要注意的是:我发现还需要通过 fileAppender.setFile() 设置活动名称,否则活动文件在滚动之前将不可见。我将在下面的另一个答案中放一个示例。
    【解决方案2】:

    您可能需要 log4j 配套/附加组件才能使用 rolling.RollingFileAppender。

    http://logging.apache.org/log4j/companions/index.html

    编辑:

    这是可让您设置滚动策略的 api 参考。

    http://logging.apache.org/log4j/companions/apidocs/org/apache/log4j/rolling/RollingFileAppender.html

    【讨论】:

    • 感谢您的信息,看来我确实需要使用附加功能。有点奇怪,但很高兴知道。
    • @DavidLevesque 谢谢。更新链接
    【解决方案3】:

    这是基于 cquezel 的回答。更改活动文件名上的文件名以及策略文件名模式对我有用。如果您不更改活动文件名,则当前日志在轮换发生之前不可见。在这种情况下,我只是将日志文件的名称从“Launcher”更改为。

    private static final String LOG4J_ROLLING_FILE_NAME_TOKEN = "Launcher";
    
    /*
     * Change the name of the the log file as configured through log4j.xml
     * by replacing the placeholder file name token ("Launcher") with the
     * a new "actionName".
     */
    private static void log4jConfig(String actionName) {
    
        org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
        RollingFileAppender fileAppender = (RollingFileAppender)rootLogger.getAppender("fileAppender");
    
        // <param name="FileNamePattern" value="/var/log/Launcher.log.%d{yyyy-MM-dd}.gz"/>
        String currentLogFile = fileAppender.getFile();
        String newLogPattern = currentLogFile.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);
        fileAppender.setFile(newLogPattern);
    
        TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) fileAppender.getRollingPolicy();
        String fileNamePattern = timeBasedRollingPolicy.getFileNamePattern();
        String newFileNamePattern = fileNamePattern.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);;
        timeBasedRollingPolicy.setFileNamePattern(newFileNamePattern);
        timeBasedRollingPolicy.activateOptions();
    
        fileAppender.activateOptions();
    
        LOG.info("  Redirected launcher log output to log pattern: " + newFileNamePattern);
    }
    

    【讨论】:

      【解决方案4】:

      我最近不得不这样做。这不使用 RollingFileAppender,但我想你会明白的

          public synchronized static MNLogger getLogger() {
              if (logInstance != null) return logInstance;
              Layout layout = new PatternLayout("%d{ABSOLUTE} [%t] %c{1} %m%n");
              Logger logger=Logger.getLogger(MigrationLogger.class);
              Appender a=logger.getAppender("MigrationMemory");
              if (a ==null) {
      
                  //log4j.appender.M=org.apache.log4j.MemoryAppender
                  MemoryAppender m=new MemoryAppender();
                  m.setLayout(layout);
                  m.setName("MigrationMemory");
                  logger.addAppender(m);          
              }
              a=logger.getAppender("MigrationDisk");
              if (a ==null) {
      
      
                  String tomcat=null;
                  try {
                      tomcat=JSPLogger.getTomcatPath();
                  } catch(Exception e) {
                      try {
                          tomcat=JSPLogger.getTempDir();
                      } catch (IOException e1) {
                          /* swallow*/
                      }
                  }
                  String filename=tomcat+File.separator+"logs"+File.separator+"Migration.log";
      
                  try {
      
                      FileAppender f =new FileAppender(layout,filename,true);
                      f.setName("MigrationDisk");
                      logger.addAppender(f);
                  } catch (IOException e) {
                      /* swallow */
                  }
      //          ConsoleAppender c=new ConsoleAppender(layout);
          //      logger.addAppender(c);
              }
              logger.setLevel(Level.ALL);
              logInstance=new LoggerWrap(logger);
              return logInstance;
      
          }
      

      【讨论】:

        【解决方案5】:

        此示例将为每分钟创建记录器,如果您想每天更改日期模式值。

        <appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender">
                <param name="File" value="./applogs/logger.log" />           
                 <param name="Append" value="true" />           
                <param name="Threshold" value="debug" />          
                 <appendToFile value="true" /> 
                 <param name="DatePattern" value="'.'yyyy_MM_dd_HH_mm"/> 
                 <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
                 <param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/>
                 <param name="rollOver" value="TRUE"/>   
                 </rollingPolicy>            
                 <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" />
                 </layout>
            </appender>
            <root>
                <level value="info" />
                <appender-ref ref="ASYNC" />
            </root>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-21
          • 2018-11-26
          • 2011-04-18
          • 2012-07-18
          • 2016-02-15
          • 2014-07-26
          • 1970-01-01
          相关资源
          最近更新 更多