【问题标题】:How to redirect System.out to a log file using Logback?如何使用 Logback 将 System.out 重定向到日志文件?
【发布时间】: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


【解决方案1】:

有一个小罐子可以帮你做这个: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 也可以逐个字符而不是逐行打印。

【讨论】:

  • 我怀疑我在尝试重定向标准输出而不是在代码中创建记录器对象时走错了路。如果需要一个 jar 来执行此操作,那么我怀疑 logback,xml 没有基本配置来实现我的目标。
  • 不需要jar,只需在代码中设置System.out和System.err即可。只需查看 System 类方法。您唯一需要做的就是传入一个输出到文件的 OutputStream(例如 FileOutputStream)
  • @Matthew 正如项目主页所述,hack 表示非常旧的代码或糟糕的库。你永远不应该依赖这样的东西来构建一个新的应用程序。里面的代码并不复杂。
  • 我发现以下实现,LoggerPrintStream,如果您想自己实现,可能会有所帮助。 github.com/dmlloyd/openjdk/blob/jdk/jdk/src/java.rmi/share/…
【解决方案2】:

sysout-over-slf4j 解决方案 100% 回答了这个问题。

请注意:如果您设置 Java Util Logger -> SLF4j 桥 (jul-to-slf4j),所有 System.out.println 消息也将在您的 logback 日志文件中,以及打印到的所有消息Java util 记录器。

设置方法如下: https://stackoverflow.com/a/43242620/2359435

【讨论】:

  • sysout-over-slf4j 不会重定向通过 write(byte[])write(int)write(byte[], int, int) 传入的数据。这是一个有意识的决定(节省了几个通常不必要的呼叫来源检查周期),但如果数据丢失,您的日志中将没有任何线索。它确实咬人:Oracle OpenJDK 中的 SSL 代码在设置 -Djavax.net.debug 时包含此类调用。
【解决方案3】:

是的,您可以使用类似于..的配置来做到这一点。

<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>

【讨论】:

  • 这是记录到控制台。问题与此相反,实际上是捕获 System.out 并将其写入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多