2013-03-20 22 views
6

アプリケーションでlog4jを使用して、異なるログレベルの特定のパッケージをログに記録しています。unixリダイレクトの前に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> 

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

答えて

2

をlog4jのにstdoutとstderrをリダイレクトするには、このような何かを試してみてください:

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

System.setOut(new PrintStream(new LoggingOutputStream(Logger.getRootLogger(), Level.INFO), true); 

LoggingOutputStreamのためには、コンソールに何をしたい印刷するのlog4jを取得するにはthis example

から開始することができます(としたい場合は、バックファイル/ノードにこれをキャプチャする)、適切なレベルにConsoleAppenderを有効

log4jの2.Xについて
+0

私はちょうどあなたが提供されたリンクからクラスで、これら2つの行を試してみた、と私はまだ任意のシステムを見ることができません.err.print msgは私のlog4jファイルにあります。 – kkudi

+0

ええ、Printstreamで自動フラッシュを忘れました。 –

+0

を修正すると、out.logにstderr/stdout出力がもうないという唯一の警告がありました。 – kkudi

5

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の-のiostream
関連する問題