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 如何使用Logback将System.out重定向到日志文件?_Java_Logging_Logback_Slf4j - Fatal编程技术网

Java 如何使用Logback将System.out重定向到日志文件?

Java 如何使用Logback将System.out重定向到日志文件?,java,logging,logback,slf4j,Java,Logging,Logback,Slf4j,如何使用Logback在Java程序中捕获System.out消息 例如,我想使用以下代码: System.out.println("test: console out to file instead"); 。。。并将其输出捕获到文件中 这可以使用logback.xml配置文件来完成吗?是的,您可以使用类似..的一些配置来完成 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <tar

如何使用Logback在Java程序中捕获System.out消息

例如,我想使用以下代码:

System.out.println("test: console out to file instead");
。。。并将其输出捕获到文件中


这可以使用logback.xml配置文件来完成吗?

是的,您可以使用类似..的一些配置来完成

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

系统输出
...

有一个小罐子可以帮你做到这一点:

请务必阅读常见问题解答:-如果您使用此模块并将logback配置为输出到标准输出,您将得到一个StackOverflowerErrors:D流


如果您想自己执行此操作,则需要将System.out和System.err替换为自定义的
PrintWriter
(?我无法完全记住类名)。这个定制的
PrintWriter
需要以半智能的方式将调用转发到logback,因为打印写入程序也可以逐个字符而不是按行打印。

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

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

以下是如何设置它:

我怀疑我试图重定向标准输出而不是在代码中创建记录器对象时走错了方向。如果需要一个jar来实现这一点,那么我怀疑没有为logback、xml进行基本配置来实现我的目标。不需要jar,只需在代码中设置System.out和System.err即可。只需看看系统类方法。你需要做的唯一一件事就是传入一个输出到一个文件(例如FileOutputStream)的OutputStream@Matthew,正如项目主页所说,这是对非常旧的代码或糟糕的库的
攻击。你不应该依赖这样的东西来构建一个新的应用程序。其中的代码不是非常复杂。我发现下面的实现LoggerPrintStream如果您想自己实现,可能会很有帮助。这是登录到控制台。问题与此相反,事实上,捕获System.out并将其写入文件.sysout-over-slf4j不会重定向通过
写入(字节[])
写入(int)
写入(字节[],int,int)
传入的数据。这是一个有意识的决定(节省了一些通常不必要的呼叫来源检查周期),但如果数据丢失,您的日志中就没有任何线索。而且它确实有用:当设置了
-Djavax.net.debug
时,Oracle OpenJDK中的SSL代码包含这样的调用。