【发布时间】:2017-01-03 08:17:29
【问题描述】:
如何使用 Logback 在 Java 程序中捕获 System.out 消息?
例如,我想使用这段代码:
System.out.println("test: console out to file instead");
...并将其输出捕获到文件中。
这可以使用 logback.xml 配置文件来完成吗?
【问题讨论】:
标签: java logging logback slf4j
如何使用 Logback 在 Java 程序中捕获 System.out 消息?
例如,我想使用这段代码:
System.out.println("test: console out to file instead");
...并将其输出捕获到文件中。
这可以使用 logback.xml 配置文件来完成吗?
【问题讨论】:
标签: java logging logback slf4j
有一个小罐子可以帮你做这个:http://projects.lidalia.org.uk/sysout-over-slf4j/index.html
请阅读常见问题解答:http://projects.lidalia.org.uk/sysout-over-slf4j/faq.html - 如果您使用此模块并将 logback 配置为输出到标准输出,您将获得 StackOverFlowErrors 流:D
如果您想自己执行此操作,则需要将 System.out 和 System.err 替换为自定义 PrintWriter(?我无法完全记住类名)。这个自定义 PrintWriter 需要以半智能的方式将调用转发到 logback,因为 print writters 也可以逐个字符而不是逐行打印。
【讨论】:
hack 表示非常旧的代码或糟糕的库。你永远不应该依赖这样的东西来构建一个新的应用程序。里面的代码并不复杂。
sysout-over-slf4j 解决方案 100% 回答了这个问题。
请注意:如果您设置 Java Util Logger -> SLF4j 桥 (jul-to-slf4j),所有 System.out.println 消息也将在您的 logback 日志文件中,以及打印到的所有消息Java util 记录器。
【讨论】:
write(byte[])、write(int) 和 write(byte[], int, int) 传入的数据。这是一个有意识的决定(节省了几个通常不必要的呼叫来源检查周期),但如果数据丢失,您的日志中将没有任何线索。它确实咬人:Oracle OpenJDK 中的 SSL 代码在设置 -Djavax.net.debug 时包含此类调用。
是的,您可以使用类似于..的配置来做到这一点。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<filter class="com.foo.StdOutFilter" />
...
</appender>
<logger name="mylogger" level="debug">
<appender-ref ref="stdout" />
</logger>
【讨论】: