2017-07-12 19 views
0

log4j2を使用すると、同期型ロガーと非同期型ロガーが連携して動作するようになっています。同期型ロガーと非同期型ロガーが混在していない - log4j2

ここからApache Documentation(同期と非同期のロガーのミキシング)の例を実行し、以下のアプリケーションを実行するとログファイルが作成されますが、何も書き込まれません。私は同じアペンダーを指し示す2つのロガーを追加するのもよく分かりませんが、Apacheのドキュメンテーションなので、大丈夫だと思います。

LOG4J2構成

<?xml version="1.0" encoding="UTF-8"?> 

<!-- No need to set system property "Log4jContextSelector" to any value 
    when using <asyncLogger> or <asyncRoot>. --> 

<Configuration status="WARN"> 
    <Appenders> 
     <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. --> 
     <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log" 
          immediateFlush="false" append="false"> 
      <PatternLayout> 
       <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern> 
      </PatternLayout> 
     </RandomAccessFile> 
    </Appenders> 
    <Loggers> 
     <!-- pattern layout actually uses location, so we need to include it --> 
     <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true"> 
      <AppenderRef ref="RandomAccessFile"/> 
     </AsyncLogger> 
     <Root level="info" includeLocation="true"> 
      <AppenderRef ref="RandomAccessFile"/> 
     </Root> 
    </Loggers> 
</Configuration> 

のpom.xml

<dependencies> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.3.6</version> 
    </dependency> 
</dependencies> 

アプリケーション

import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.LogManager; 

public class Main { 
    public static void main(String[] args) { 
     Logger logger = LogManager.getLogger("HelloWorld"); 
     for(int i = 0; i < 20; i++){ 
      logger.trace(String.format("Hello number %d", i)); 
     } 
     LogManager.shutdown(); 
    } 
} 

しかし、log4j2の設定を変更し、loggers要素を以下のように変更すると、ログファイルに期待される出力が得られます。

<Loggers> 
    <AsyncRoot name="com.foo.Bar" level="trace" includeLocation="true"> 
     <AppenderRef ref="RandomAccessFile"/> 
    </AsyncRoot> 
</Loggers> 

は私が必要なもの

は、理想的には私は仕事に、次のような何かをしたいです。ただし、この構成では、行をコンソールに出力し、ログファイルを作成しますが、内容を書き込むことはありません。私は何が欠けていますか?

<?xml version="1.0" encoding="UTF-8"?> 

<!-- No need to set system property "Log4jContextSelector" to any value 
    when using <asyncLogger> or <asyncRoot>. --> 

<Configuration status="WARN"> 
    <Appenders> 
     <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. --> 
     <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log" 
          immediateFlush="false" append="false"> 
      <PatternLayout> 
       <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern> 
      </PatternLayout> 
     </RandomAccessFile> 

     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n"/> 
     </Console> 

    </Appenders> 
    <Loggers> 
     <!--write to file - i dont care when it happens--> 
     <AsyncLogger level="trace" includeLocation="true"> 
      <AppenderRef ref="RandomAccessFile"/> 
     </AsyncLogger> 

     <!--Async so the console messages appear in the order expected--> 
     <Root level="trace"> 
      <AppenderRef ref="Console"/> 
     </Root> 

    </Loggers> 
</Configuration> 

答えて

0

最初のLOG4J2構成では、ルート・ロガーのレベルが「情報」であるためです。 メインメソッドではlogger.trace()を実行しています。 参照先doc:https://logging.apache.org/log4j/2.0/manual/architecture.html

ここで、レベルオーダーを表します。

Asyncrootの場合、レベルを「トレース」に変更しました。それが働いている理由です。 また、コンソールとしてappenderを追加するときは、level = "trace"を持っています。

ロガーロガーを取得しているのは、ロガー名 "HelloWorld"がないためです。デフォルトでは、ルートロガーが与えられます。

logger.info()を使用してみてください。

+0

私は完全に理解しているか分からない。最初の設定を使用すると、ログレベルに関係なく、ログファイルに行が生成されません。AsyncLoggerはログファイルにログを記録しませんか?反復を繰り返すには:記録されているログを取得しない。 –

+0

最初の設定をそのまま使用し、logger.info(String.format( "Hello number%d"、i))のmainメソッド内のlogger.trace(String.format( "Hello number%d"、i))を置き換えます。その後、あなたのログをファイルに入れますか? – lonwolf

関連する問題