我维护一个应用程序,它充当多个单独程序的容器.这些程序有自己的专用日志记录工具,即他们记录的所有内容都对特殊的日志文件.
尽管如此,应用程序开发人员似乎总是喜欢抛出System.out.println并e.printStackTrace调用,因此在运行容器时无法维护干净的控制台.
我怎样才能防止污染这些应用程序System.out和System.err?
实施说明:
更新:
简单地重定向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");
Run Code Online (Sandbox Code Playgroud)
这应该成功.
更新2:
使用类似的代码加载和配置应用程序
App app = new UrlClassLoader(...).loadClass(className)).newInstance();
app.setLogger(loggerForClass(app));
Run Code Online (Sandbox Code Playgroud)
Log4j从系统类加载器加载.
我有一个测试控制台应用程序的任务.我可以访问一个方法,但也想检查字符串格式是否正常工作.
由于此方法不返回字符串,而是打印到控制台,有没有办法拦截列表打印行?
测试这种东西甚至有意义吗?
我正在寻找一种获取System.out.println文本并将其保存在.txt文件中的方法,例如:
System.out.println("Java vendor: " + System.getProperty("java.vendor"));
System.out.println("Operating System architecture: " + System.getProperty("os.arch"));
System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("Operating System: " + System.getProperty("os.name"));
System.out.println("Operating System Version: " + System.getProperty("os.version"));
System.out.println("Java Directory: " + System.getProperty("java.home"));
Run Code Online (Sandbox Code Playgroud)
我想要输出一个.txt文件,有什么想法吗?谢谢
好的,所以我有一个非常大的Java项目,我已经工作多年了(游戏,如果你必须知道的话).
不幸的是,一条神秘的信息已经开始被打印出来.无论我的搜索时间长短,我都无法确定消息的位置.
我知道你可以覆盖println方法,我很好奇是否有可能在打印的消息上附加某种调试信息?就像从或许它打印的行或文件?我尝试在谷歌搜索这个,但它只是太详细的问题,我找不到答案.
更糟糕的是,这个消息非常含糊不清.它只是"-1".
至少我现在知道使用适当的记录器而不是简单的println().