【问题标题】:catch stderr and stdout in log4j before unix redirection在 unix 重定向之前在 log4j 中捕获 stderr 和 stdout
【发布时间】:2013-03-09 22:39:55
【问题描述】:

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

然而,stderr 和 stdout 似乎没有在这个日志文件中被捕获,而是当应用程序以

启动时它们被打印在一个文件中
java AppName >> out.log

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

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>

更新:

stackoverflow 错误的堆栈跟踪:

WARN root buffer size limit:65log4j:WARN root buffer size limit:65Exception in thread "Thread-12"
2013-03-22 09:14:24,451 [Thread-12] ERROR root - java.lang.StackOverflowError
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at java.io.BufferedWriter.write(BufferedWriter.java:202)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at java.io.Writer.write(Writer.java:140)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at java.io.PrintStream.write(PrintStream.java:475)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at java.io.PrintStream.print(PrintStream.java:619)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at java.io.PrintStream.println(PrintStream.java:756)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.helpers.LogLog.warn(LogLog.java:171)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.AsyncAppender.append(AsyncAppender.java:175)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)


2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.Category.callAppenders(Category.java:206)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.Category.forcedLog(Category.java:391)
2013-03-22 09:14:24,452 [Thread-12] ERROR root -        at org.apache.log4j.Category.log(Category.java:838)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at com.company.something.AClass.LoggingOutputStream.flush(LoggingOutputStream.java:198)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at java.io.PrintStream.write(PrintStream.java:432)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:85)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:168)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at java.io.PrintStream.write(PrintStream.java:477)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at java.io.PrintStream.print(PrintStream.java:619)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at java.io.PrintStream.println(PrintStream.java:756)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at org.apache.log4j.helpers.LogLog.warn(LogLog.java:171)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at org.apache.log4j.AsyncAppender.append(AsyncAppender.java:175)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
2013-03-22 09:14:24,453 [Thread-12] ERROR root -        at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:

【问题讨论】:

    标签: java log4j stdout stderr


    【解决方案1】:

    要将 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,您可以从this example开始

    要让 log4j 将您想要的内容打印到控制台(如果需要,还可以将其捕获回文件/节点中),请将 ConsoleAppender 启用到适当的级别

    【讨论】:

    • 我刚刚用你提供的链接中的类尝试了这两行,但我的 log4j 文件中仍然看不到任何 System.err.print 消息。
    • 是的,忘记了打印流上的自动刷新。上面更正
    • 这似乎奏效了,唯一需要注意的是 out.log 不再具有 stderr/stdout 输出。
    • 要将 log4j 事件返回到您的 out.log,您需要添加一个 ConsoleAppender
    • 好的。问题可能出在您的 AsyncAppender 上 - 检查 this doc 上的 bufferSize
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 1970-01-01
      • 2014-07-22
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多