log4j2
設定例
pom.xml
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- webアプリを作成する場合はこれも設定。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
-->
</dependencies>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<!-- statusでlog4j2自体のログを出力する。通常はoff -->
<Configuration status="off">
<!-- Propertiesは、nameの値を変数として使える -->
<Properties>
<!-- ログのフォーマット
%dは日時。{}に日時の形式を指定
%tはスレッド名
%-6pはログレベル名称を左詰めで6文字分出力する。「debug」であれば後ろに空白1文字が追加される。
但し、%-3pとしても名称は削られず「debug」として出力される。%6と-をとると右づめになる。
%c{x}は,例えばロガー名がorg.apache.commons.Fooのとき%c{2}の場合、commons.Fooが出力される
%mはログメッセージ
%nは改行
-->
<Property name="format1">%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-6p %c{10} line:%L %m%n</Property>
<Property name="logfile">./logs/app.log</Property>
<Property name="logfile-archive">./logs/app_%d{yyyy-MM-dd-HH-mm}.tar.gz</Property>
</Properties>
<Appenders>
<!-- コンソールに出力する設定 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${format1}</pattern>
</PatternLayout>
</Console>
<!-- ファイルに出力する設定 -->
<!-- どこかのタイミングでローテートする。filePatternとTimeBasedTriggeringPoliciyに依存。-->
<RollingFile name="logfile001" append="true" fileName="${logfile}"
filePattern="${logfile-archive}">
<PatternLayout>
<pattern>${format1}</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- trace以上のログを出力する -->
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="logfile001" />
</Root>
<!-- LoggerでRootとは別にpackageごとに指定できる。
<Logger name="sample.log4j2" level="debug" additivity="false">
<AppenderRef ref="Test" />
</Logger>
-->
<!-- 同一packageで出力先によってログレベルを変えたい場合は、AppenderRefにlevelをつける。
<Logger name="ittimfn.sample" level="debug" additivity="false">
<AppenderRef level="debug" ref="logfile001" />
<AppenderRef level="info" ref="Console" />
</Logger>
-->
</Loggers>
</Configuration>
java
package sample.log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
// getLoggerの引数はロガー名を指定する。
// log4j2では、ロガー名の指定が省略可能になった。
// なったが・・・実行可能jarファイルを実行時に書いておかないとエラーになる。
private Logger logger = LogManager.getLogger(App.class);
public static void main( String[] args ) {
App a = new App();
a.runSample();
}
public void runSample() {
logger.trace("Start");
int a = 1;
int b = 2;
String c = null;
logger.debug("debug");
logger.info("info={}",a);
logger.warn("warn={},={}" ,a,b);
logger.error("error={}",c);
logger.trace("End");
}
}
ThreadContext
log4jが持っている、log専用のMapやStackのようなもの。
- Stack
- push/pop
- Map
- put/remove
- clearMap
Java
/*
* This Java source file was generated by the Gradle 'init' task.
*/
package ittimfn.threadcontext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class App {
private Logger logger = LogManager.getLogger();
public void exec(String[] args) {
ThreadContext.put("key", "value");
logger.info("info");
}
public static void main(String[] args) {
new App().exec(args);
}
}
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<!-- statusでlog4j2自体のログを出力する。通常はoff -->
<Configuration status="off">
<!-- Propertiesは、nameの値を変数として使える -->
<Properties>
<!-- ログのフォーマット
%dは日時。{}に日時の形式を指定
%tはスレッド名
%-6pはログレベル名称を左詰めで6文字分出力する。「debug」であれば後ろに空白1文字が追加される。
但し、%-3pとしても名称は削られず「debug」として出力される。%6と-をとると右づめになる。
%c{x}は,例えばロガー名がorg.apache.commons.Fooのとき%c{2}の場合、commons.Fooが出力される
%mはログメッセージ
%nは改行
-->
<Property name="format1">%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-6p %c{10} line:%L %m</Property>
<!-- ThreadContextの値を取得。 -->
<Property name="thread-context">key=%X{key}</Property>
<Property name="line-separator">%n</Property>
<Property name="logfile">./logs/testlog.log</Property>
<Property name="logfile-archive">./logs/testlog_%d{yyyy-MM-dd-HH-mm}.tar.gz</Property>
</Properties>
<Appenders>
<!-- コンソールに出力する設定 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${format1} , ${thread-context}${line-separator}</pattern>
</PatternLayout>
</Console>
<!-- ファイルに出力する設定 -->
<!-- どこかのタイミングでローテートする。filePatternとTimeBasedTriggeringPoliciyに依存。-->
<RollingFile name="logfile001" append="true" fileName="${logfile}"
filePattern="${logfile-archive}">
<PatternLayout>
<pattern>${format1} , ${thread-context}${line-separator}</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- trace以上のログを出力する -->
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="logfile001" />
</Root>
<!-- LoggerでRootとは別にpackageごとに指定できる。
<Logger name="sample.log4j2" level="debug" additivity="false">
<AppenderRef ref="Test" />
</Logger>
-->
</Loggers>
</Configuration>
実行結果
2023/02/19 00:37:56.102 [main] INFO ittimfn.threadcontext.App line:17 info , key=value