我想使用 Log4j API,但配置遇到了一些问题。
这是我的 LogWriter 类:
public class LogWriter {
static Logger logger = Logger.getLogger(LogWriter.class);
public LogWriter(String logFilePath) {
File outFile = new File(logFilePath);
try {
PrintStream outStream = new PrintStream(new FileOutputStream(outFile));
System.setOut(outStream));
System.setErr(outStream);
} catch (FileNotFoundException e) {
throw new IllegalArgumentException("File not Found");
}
BasicConfigurator.configure();
}
public void write(String infoString) {
logger.info(infoString);
}
}
现在工作正常,但我无法同时写入记录器文件和控制台(可能是因为 System.setOut
)
我添加了一个如下所示的 log4j.properties 文件:
# Root logger option
log4j.rootLogger=INFO, console
# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p- %m%n
现在我的问题是,如何使我的 LogWriter 和 log4j.properties 文件一起工作,以便输出进入记录器文件和控制台? 我必须在 LogWriter 中更改哪些内容?
最佳答案
在安装 LogWriter
之前,您必须将存储在 System.out
和 System.err
中的原始引用的副本保留在某处。使用它们来编写一个新的附加程序。在 log4j.appender.console
中配置 log4j 以使用此附加程序。
背景:默认的 log4j ConsoleAppender
仅写入 System.out
。如果您更改它,log4j 将使用您提供的任何内容。无法配置 ConsoleAppender
在其他地方写入。在您的 LogWriter
中,无法区分来自 log4j 和 System.out.println()
的输出。
因此唯一的解决方案是编写另一个写入原始 System.out
的附加程序。
也就是说,使用原始的 ConsoleAppender
并使用 FileAppender
而不是您自己的 LogWriter
可能会更明智。只要确保您永远不会在代码中的任何地方直接使用 System.out
即可。
关于java - Log4j 具有 log4j.properties 的两个输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18735629/