【问题标题】:Log4j : Creating/Modifying appenders at runtime, log file recreated and not appendedLog4j:在运行时创建/修改附加程序,重新创建日志文件而不附加
【发布时间】:2012-05-28 18:52:14
【问题描述】:

我想为调用 MyMethod() 的特定方法创建和启用附加程序,其日志输出应该转到“logFilePath”处的文件。

我不想在 xml 配置文件中包含这个 appender,所以我想在运行时创建它。

首先,我尝试在运行时修改记录器属性,然后调用activateOptions,例如。之前将 level 设置为 DEBUG 并在 finally 块中将其设置为 Off ,以便仅在使用该方法时记录输出。那没用。

我的问题是 appender 每次都重新创建一个文件,而不是附加到同一个文件。尽管 setAppend 为真。

我对 log4j 不是很熟悉,所以请随时提出替代方法。 以下是解释我正在尝试的示例代码。

private static FileAppender createNewAppender(String logFilePath) {
    FileAppender appender = new FileAppender();
    appender.setName("MyFileAppender");
    appender.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
    appender.setFile(logFilePath);
    appender.setAppend(true);
    appender.setThreshold(Level.INFO);
    appender.activateOptions();
    Logger.getRootLogger().addAppender(appender);
    return appender;
}

private static void removeAppender() {
    Logger.getRootLogger().removeAppender(fileAppender) ; // ("MyFileAppender");
}

我通过以下方式调用上述方法:

private static FileAppender fileAppender = null;

private static void myMethod(String logFilePath) {        
    try {
        fileAppender = createNewAppender();
        someOperation();
    }
    finally {
        removeAppender();
        fileAppender=null; 
    }
}

【问题讨论】:

标签: java log4j


【解决方案1】:

我从 scala 执行以下操作(基本相同):

将我的根日志记录级别设置为 TRACE,但将我的全局附加程序的阈值设置为 info。

# Root logger option
log4j.rootLogger=TRACE, file, stdout

# log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log.log
log4j.appender.file.MaxFileSize=100MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss} %m%n
log4j.appender.file.Threshold=INFO

# log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %m%n
log4j.appender.stdout.Threshold=INFO

然后在我要登录的课程中:

private def set_debug_level(debug: String) {
  import org.apache.log4j._
  def create_appender(level: Level) {
    val console_appender = new ConsoleAppender()
    val pattern = "%d %p [%c,%C{1}] %m%n"
    console_appender.setLayout(new PatternLayout(pattern))
    console_appender.setThreshold(level)
    console_appender.activateOptions()
    Logger.getRootLogger().addAppender(console_appender)
  }
  debug match {
    case "TRACE" => create_appender(Level.TRACE)
    case "DEBUG" => create_appender(Level.DEBUG)
    case _ => // just ignore other levels
  }
}

所以基本上,由于我将新附加程序的阈值设置为 TRACE 或 DEBUG,它实际上会附加。如果我将根更改为另一个级别,它将不会记录较低的级别。

【讨论】:

    【解决方案2】:

    很简单,只需创建一个方法并添加它

    String targetLog="where ever you want your log"
    
    FileAppender apndr = new FileAppender(new PatternLayout("%d %-5p [%c{1}] %m%n"),targetLog,true);    
    logger.addAppender(apndr);
    logger.setLevel((Level) Level.ALL);
    

    然后在您需要登录的任何方法中,只需执行以下操作: logger.error("你的错误在这里");

    【讨论】:

    • 您似乎可以添加新的附加程序,但您不能更改现有的附加程序。至少,RollingFileAppender 没有setFileName()
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2017-01-31
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多