gpt4 book ai didi

java - 在 java 中删除对 System.out 的访问

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:53 24 4
gpt4 key购买 nike

我维护一个应用程序,它充当多个单独程序的容器。这些程序有自己专用的日志记录工具,即它们记录的所有内容都会记录到一个特殊的日志文件中。

尽管如此,应用程序开发人员似乎喜欢到处调用 System.out.printlne.printStackTrace ,这使得它不可能运行容器时保持干净的控制台。

如何防止这些应用程序污染 System.outSystem.err


实现说明:

  • 应用程序使用 Log4j 进行日志记录;
  • 容器也使用控制台进行日志记录,但它严格保留用于生命周期事件和问题,所以我仍然需要控制台;
  • 应用程序是使用自定义类加载器加载的,但未应用安全检查。

更新:

简单地重定向 System.out 是行不通的,因为它重定向了所有输出,所以这样的事情会失败:

    System.setOut(new PrintStream(new OutputStream() {

@Override
public void write(int b) {

throw new Error("Not on my watch you don't");

}
}));

Logger logger = Logger.getLogger(Runner.class);
logger.info("My log message");

这应该会成功。

更新 2:

使用类似于以下的代码加载和配置应用程序

App app = new UrlClassLoader(...).loadClass(className)).newInstance();
app.setLogger(loggerForClass(app));

Log4j 是从系统类加载器加载的。

最佳答案

假设您可以控制容器输出,您可以执行以下操作:

import java.io.*;
public class SysOut {
public static void main(String[] args) throws Exception {
PrintStream pw = new PrintStream(new FileOutputStream("a.txt"));
PrintStream realout = System.out;
System.setOut(pw);
System.out.println("junk");
realout.print("useful");
}
}

$ java SysOut
useful
$ cat a.txt
junk

关于java - 在 java 中删除对 System.out 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710914/

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