gpt4 book ai didi

java - Log4j 具有 log4j.properties 的两个输出?

转载 作者:行者123 更新时间:2023-12-01 14:08:18 25 4
gpt4 key购买 nike

我想使用 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.outSystem.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com