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

我想为特定方法调用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; } } 

很容易创建一个方法并添加它

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

我从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,它实际上会附加。 如果我将根更改为另一个级别,则不会记录较低级别。