我想为特定方法调用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;
}
}
答案 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,它实际上会附加。如果我将根更改为另一个级别,则不会记录较低级别。