設定ファイル関係を書くなら、
個人的にはpropertiesやXMLやJSONよりYAMLが好きです。
ここではLog4j2の設定ファイルをYAMLで書いてみました。
自己満ネタです。
依存関係
設定ファイルをXMLで書く場合は
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.2</version> </dependency>
があれば大丈夫だけど、YAMLの場合は
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.5.1</version> </dependency>
も追加で必要のようです。
これがないと log4j2.yml
を配置しても使ってくれませんでした。
設定ファイル
log4j2.xml
例えばこんなXMLの場合。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn"> <Appenders> <Console name="console"> <PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level - %m%n" /> </Console> <RollingFile name="file" fileName="${basedir}/logs/${project.build.finalName}.log" filePattern="${basedir}/logs/%d{yyyy-MM-dd}_${project.build.finalName}.log.gz"> <PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level - %m%n" /> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> </Appenders> <Loggers> <Logger name="trylog4j2yaml" level="debug" additivity="false"> <AppenderRef ref="console" /> <AppenderRef ref="file" /> </Logger> <Root level="warn"> <AppenderRef ref="console" /> <AppenderRef ref="file" /> </Root> </Loggers> </Configuration>
log4j2.yml
YAMLだとこう書けました。
log4j2.xml
の代わりに log4j2.yml
を置けばOK。
AppenderRef
のように同じ名前の要素が複数登場する場合は、
ハッシュの配列として要素名にぶらさげてやるといけました。
Configuration: status: "warn" Appenders: Console: name: "console" PatternLayout: pattern: "%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level - %m%n" RollingFile: name: "file" fileName: "${basedir}/logs/${project.build.finalName}.log" filePattern: "${basedir}/logs/%d{yyyy-MM-dd}_${project.build.finalName}.log.gz" PatternLayout: pattern: "%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level - %m%n" Policies: TimeBasedTriggeringPolicy: {} Loggers: Logger: - name: "trylog4j2yaml" level: "debug" additivity: "false" AppenderRef: - ref: "console" - ref: "file" Root: level: "warn" AppenderRef: - ref: "console" - ref: "file"
// ただ、これがベストな書き方かは分かってないです...
Spring Boot 1.2.2 以上の場合
Spring Boot (spring-boot-starter-web) はデフォルトのログ出力実装が
Logback なので、まずはそれを Log4j に切り替えます。
spring-boot-starter-logging
を外して
代わりに spring-boot-starter-log4j2
を追加すればOK。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
あとは同様に、
- 依存関係に
jackson-dataformat-yaml
を追加。 log4j2.xml
の代わりにlog4j2.yml
を配置。
をやればいけました。
Spring Boot 1.2.1 以下の場合
log4j2.yml
を置いても無視されました...
Spring Boot の自動設定で読みに行くファイル名のリストに
log4j2.yml
が入ってないようでした。
だったら自分で指定しちゃえとゆーことで、application.yml
で
log4j2.yml
のファイルパスを指定すると使えました。
# application.yml logging: config: "classpath:log4j2.yml"
多分こちらのIssueに該当。
1.2.2 で修正されたようです。
サンプルコード
- 単純なJavaアプリ版 - akihyro/try-log4j2-yaml
- Spring Boot アプリ版 - akihyro/try-log4j2-yaml
- Spring Boot 1.2.1 アプリ版 - akihyro/try-log4j2-yaml