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>
私は完全に理解しているか分からない。最初の設定を使用すると、ログレベルに関係なく、ログファイルに行が生成されません。AsyncLoggerはログファイルにログを記録しませんか?反復を繰り返すには:記録されているログを取得しない。 –
最初の設定をそのまま使用し、logger.info(String.format( "Hello number%d"、i))のmainメソッド内のlogger.trace(String.format( "Hello number%d"、i))を置き換えます。その後、あなたのログをファイルに入れますか? – lonwolf