Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “想做什么?”;System.out.println();将消息打印到log4j_Java_Logging - Fatal编程技术网

Java “想做什么?”;System.out.println();将消息打印到log4j

Java “想做什么?”;System.out.println();将消息打印到log4j,java,logging,Java,Logging,我们的项目使用System.out.println()或System.err.println()输出调试消息。现在我们希望使用log4j将这些输出定向到日志文件,而不仅仅是控制台。为了避免影响或风险,我们不想将所有“System.out.println()”替换为“logger.debug”,只想编写一些代码,使这些输出重定向到log4j日志文件,这些日志文件在仍然使用System.out.println()的每个类中都没有代码更改(我们知道这是一种不好的做法,但我们目前不想进行全局搜索和替换)

我们的项目使用System.out.println()或System.err.println()输出调试消息。现在我们希望使用log4j将这些输出定向到日志文件,而不仅仅是控制台。为了避免影响或风险,我们不想将所有“System.out.println()”替换为“logger.debug”,只想编写一些代码,使这些输出重定向到log4j日志文件,这些日志文件在仍然使用System.out.println()的每个类中都没有代码更改(我们知道这是一种不好的做法,但我们目前不想进行全局搜索和替换)。可能吗?谢谢。

是的。使用和替换标准输出和错误流。

您应该能够调用
System.setOut(新的SomeCustomLog4JAdapter())
其中
类SomeCustomLog4JAdapter扩展了PrintStream

鉴于您的限制,将
stdout
stderr
重定向到文件是否足够

File outFile  = new File("/var/log/jiang/stdout.log");
PrintStream outStream = new PrintStream(new FileOutputStream(outFile));
System.setOut(outStream);

File errFile  = new File("/var/log/jiang/stderr.log");
PrintStream errStream = new PrintStream(new FileOutputStream(errFile));
System.setErr(errStream);

我想这是可能的,尽管这肯定是个坏主意。你应该咬紧牙关,替换所有
系统.out.printXXx()
系统.err.printXXx()
调用

(你不必在一次大的改变中完成这项工作,如果这些事情让你感到不舒服,你也不必使用自动搜索/替换来完成。)


您可以使用
System.setOut
System.setErr
将这些流指向log4j日志文件来更改它们的流向。但是:

  • 您可能会遇到输出和/或日志文件截断的交错问题,具体取决于log4j附加器的实现方式
  • 你不会得到log4j时间戳等
  • 您将无法通过log4j配置控制日志记录,因为您的重定向是在log4j的后面进行的
  • log4j日志文件旋转无法正常工作
一个更复杂的替代方案是创建特殊的OutputStream对象来截取输出,并将其转换为对log4j记录器的调用。但这也会有问题:

  • 弄清楚每个“控制台日志消息”的结束位置可能很棘手,特别是如果您希望将多行控制台输出视为一个日志事件
  • 您只有有限的log4j可配置性,因为所有“控制台日志消息”都将通过一个记录器(或者一个用于
    out
    ,一个用于
    err
  • 与普通log4j日志相比,性能将是一个更大、更难处理的问题

根据其他人的回答,是的,
系统是可能的。设置(…)
。但我真的建议你不要这样做。你只是给未来的开发人员制造了一场噩梦,并没有真正节省任何时间和金钱。现在就做好工作,把它做好,从长远来看会有回报的


除此之外,将文本从System.out和System.err路由到log4j是(在我看来)错过使用它,因为您将无法利用日志记录级别将调试信息与错误分开。

是的……但请参阅我的答案,了解为什么这不会产生好的最终结果。然后我会说创建某种静态方法,如Debugger.println()咬紧牙关,用你的新方法替换所有的System.out。这在函数方面会产生更糟糕的结果。很抱歉,我不能提供帮助。你好,Stephen,在我们的代码中,有太多的“System.out.println()”“System.err.println()”或“e.printStackTrace()”(是的,非常糟糕).有没有什么好方法可以用影响和风险最小的log4j来替换和组织它们?谢谢。@Eric-手工操作风险和影响都很小。真的。就像我说的,你不必一次完成所有的工作。谢谢你的建议,Stephen。是的,可能风险和影响不会很大,但是在每个cl中都做这样的代码更改一个接一个的屁股可能既耗时又无聊…@Eric Jiang-我们采取一种更高风险的方法。那不会无聊…特别是如果你把它塞满了:-)。