Log4j:在运行时创建/修改appender,重新创建日志文件而不附加

时间:2012-05-22 09:31:53

标签: java log4j

我想为特定方法调用MyMethod()创建和启用appender,其日志输出应该转到“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; 
    }
}

2 个答案:

答案 0 :(得分:7)

非常简单,只需创建一个方法并添加此

即可
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(“你的错误在这里”);

答案 1 :(得分:0)

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

将我的根日志记录级别设置为TRACE,但将我的全局appender的阈值设置为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
  }
}

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