2016-10-24 7 views
0

私のアプリケーションでアクションを記録するためにlog4jを使用しています。私は以下のファイルアペンダを使用します:log4jを使用してサードパーティのコンソールログを取得する方法

private FileAppender getFileAppender(String name) { 
    PatternLayout layout = new PatternLayout("%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n"); 
    StringBuilder filePath = new StringBuilder(); 
    filePath.append("logs/") 
     .append(name) 
     .append(".log"); 
    FileAppender fileAppender = null; 

    try { 
    File file = new File(filePath.toString()); 
    file.getParentFile().mkdirs(); 
    file.createNewFile(); 

    fileAppender = new FileAppender(layout, filePath.toString(), true); 
    fileAppender.setName("FileAppender"); 
    fileAppender.setAppend(true); 
    } catch (IOException e) { 
    LogWrapper.LOG.get(this.getClass().getSimpleName()).trace(e); 
    } 

    return fileAppender; 
    } 

私のアプリケーションは、Webサービスがコンソールに呼び出すログを第三者に使用しています。その後、アプリケーションを実行すると、Intellij Ideaのコンソールにログが表示されますが、生成されたログファイルは表示されません。

これらのログをFile Appenderによって生成されたファイルにリダイレクトする方法はありますか。

更新 答えは正しいですが、プロパティがどのように見えるコンソールアペンダを持つものを使用logback 1つの以上の第三者があります。このため、キャッチコンソール出力スタックの

<configuration status="OFF"> 
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 
     </pattern> 
    </encoder> 
</appender> 
<root level="WARN"> 
    <appender-ref ref="STDOUT" /> 
</root> 

。 Logbackプロパティを捕捉して書き直し、ファイルにログを記録させたり、ログをまったく使用不可にするにはどうすればいいですか?

答えて

0

あなたは、例えばWARNINGとしてINFOとSTDERRとしてSTDOUTをログに記録し、これを試すことができます。

final Logger myLog4jLogger = Logger.getLogger(getClass()); 

System.setOut(new PrintStream(new ByteArrayOutputStream() { 
    @Override 
    public synchronized void write(byte[] pB, int pOff, int pLen) { 
     super.write(pB, pOff, pLen); 
     myLog4jLogger.info(toString()); 
     reset(); 
    } 
})); 

System.setErr(new PrintStream(new ByteArrayOutputStream() { 
    @Override 
    public synchronized void write(byte[] pB, int pOff, int pLen) { 
     super.write(pB, pOff, pLen); 
     myLog4jLogger.warn(toString()); 
     reset(); 
    } 
})); 

は一度だけのLog4j初期化後やサードパーティのツールを呼び出す前に、これを行います。 プロセスのSTDOUTとSTDERRがログにリダイレクトされるため、プロセスによってSTDOUT/STDERRに送信されるすべてのテキストは、自分の"System.out.println()"を含むログに記録されることに注意してください。

また、これを使用すると、コンソールにログを記録しないようにすることができます。なぜなら、コンソールにログを記録してコンソールがログにリダイレクトされるとどうなるかわからないからです。 ??スタックオーバーフローのOutOfMemoryError)

Logbackを使用するサードパーティに関しては、あなたはその設定ファイルにこれを追加することによって、代わりにSTDOUTのファイルへのログを送信することができます

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>myApp.log</file> 

    <encoder> 
    <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 

と交換することにより:

<appender-ref ref="STDOUT" /> 

...:

<appender-ref ref="FILE" /> 
+0

私は(外部レポーターなし)のTestNGを使用してテストを実行する場合解決策は完璧に動作しているため、コンソールに私の他の第三者ログの1つのように見えますが、その後、私はちょうどそれをGradleの使用スイートを実行スタック。サードパーティのログプロパティを取得して再書き込みしてコンソールにログインしないようにすることはできますか?あるいは、私はこの前提にまったく当てはまらないのですか? – khris

+0

このサードパーティが適切なログライブラリ(Log4j 1/2、Logback、JUL、...)を使用している場合、この設定ファイルをロードする前にログ設定ファイルを編集する必要があります。しかし、この第三者がハードコーディングされた "System.out.println()"を使用すると、あなたは立ち往生します。 – xav

+0

このようなサードパーティのログプロパティをキャッチして調整する方法を教えてください。 – khris

関連する問題