Java 在unix重定向之前捕获log4j中的stderr和stdout

Java 在unix重定向之前捕获log4j中的stderr和stdout,java,log4j,stdout,stderr,Java,Log4j,Stdout,Stderr,我在应用程序中使用log4j以不同的日志级别记录某些包 然而,stderr和stdout似乎并没有被捕获在此日志文件中,而是在应用程序启动时打印在一个文件中 java AppName >> out.log 是否可以在log4j(例如stdout作为info,stderr作为WARN/ERROR)以及out.log文件中捕获stdout和stderr log4j的设置如下所示: <log4j:configuration xmlns:log4j="http://jakarta.a

我在应用程序中使用log4j以不同的日志级别记录某些包

然而,stderr和stdout似乎并没有被捕获在此日志文件中,而是在应用程序启动时打印在一个文件中

java AppName >> out.log
是否可以在log4j(例如stdout作为info,stderr作为WARN/ERROR)以及out.log文件中捕获stdout和stderr

log4j的设置如下所示:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="FileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${MDCapture.logfile.dir}/${APP_NAME}.log"/>
        <param name="BufferedIO" value="false"/>
        <param name="DatePattern" value="'.'yyyy-MMM-dd"/>
        <layout class="org.apache.log4j.TTCCLayout">
            <param name="DateFormat" value="ISO8601"/>
        </layout>
    </appender>

    <appender name="AsyncAppenders" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="FileAppender"/>
    </appender>

<!-- LOGGER PACKAGES -->

<root>
    <priority value="info"/>
    <appender-ref ref="AsyncAppenders"/>
</root>
</log4j:configuration>

要将stdout和stderr重定向到log4j,请尝试以下操作:

System.setErr( new PrintStream( new LoggingOutputStream( Logger.getRootLogger(  ), Level.ERROR ), true);

System.setOut( new PrintStream( new LoggingOutputStream( Logger.getRootLogger(  ), Level.INFO ), true);
对于
LoggingOutputStream
,您可以从

要让log4j将您想要的内容打印到控制台(如果需要,并将其捕获回文件/节点),请为log4j 2.x启用一个适当的级别

System.setErr(IoBuilder.forLogger(LogManager.getRootLogger()).setLevel(Level.ERROR).buildPrintStream());
System.setOut(IoBuilder.forLogger(LogManager.getRootLogger()).setLevel(Level.INFO).buildPrintStream());
依赖项信息:

  • 组:org.apache.logging.log4j
  • 工件:log4j iostreams

我刚刚用您提供的链接中的类尝试了这两行,但在我的log4j文件中仍然看不到任何System.err.print msg。是的,忘记了Printstream上的自动刷新。纠正上述问题似乎有效,但唯一需要注意的是out.log不再具有stderr/stdout输出。要将log4j事件返回到your out.log,您需要添加一个ConsoleAppenderOK。此问题可能与AsyncAppender有关-请检查上的缓冲区大小
System.setErr(IoBuilder.forLogger(LogManager.getRootLogger()).setLevel(Level.ERROR).buildPrintStream());
System.setOut(IoBuilder.forLogger(LogManager.getRootLogger()).setLevel(Level.INFO).buildPrintStream());