初投稿です。
至らぬ点も多々あると思いますが、よろしくお願い致します。
※20190303 spring-boot-starterにAPIが含まれていたため、
spring-boot-starterをmavenから外して再度環境構築しました。
ログをファイルに出力したい
slf4jの導入をきちんとした事が無かったので、この機会にやってみました。
ゴール
- Eclipseのコンソールと、ログファイルにログを出力させる。
- 使うAPIはslf4jとlogback
開発環境
- java 1.8
- maven
必要なAPI
- slf4j-api:jar実行時にログを出力する
- logback-classic:ログをファイルに出力する
- logback-core:ログをファイルに出力する
その他必要なもの
- logback.xml
logback.xmlの定義
logback.xmlの定義については、かなり詳しくまとめられたサイトを参考に致しました。ご参考にして頂ければと思います。
Logback 使い方メモ
ちなみに私は次のように定義しました。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{0} - %msg \(%file:%line\)%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss'Z'} - %m%n</pattern>
</encoder>
</appender>
<root level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
pom.xmlの定義
必要なAPIを、mavenのdependencyに定義してみました(これ間違いです)。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.3</version>
</dependency>
で、次のソースを書いて実行。
public class App
{
private static Logger log = LoggerFactory.getLogger("test");
public static void main( String[] args )
{
log.debug("ログ出力テスト");
log.info("ログ出力テスト");
log.warn("ログ出力テスト");
log.error("ログ出力テスト");
}
}
コンソールログに出力!
2019-03-03 14:56:28testtest [main] DEBUG test - ログ出力テスト (App.java:19)
2019-03-03 14:56:28testtest [main] INFO test - ログ出力テスト (App.java:20)
2019-03-03 14:56:28testtest [main] WARN test - ログ出力テスト (App.java:21)
2019-03-03 14:56:28testtest [main] ERROR test - ログ出力テスト (App.java:22)
ログファイルにも出力!
2019-03-03T14:56:28Z - ログ出力テスト
2019-03-03T14:56:28Z - ログ出力テスト
2019-03-03T14:56:28Z - ログ出力テスト
2019-03-03T14:56:28Z - ログ出力テスト
無事に出力されました。
因みに次のエラーが発生した場合はAPIがブッキングしている可能性があります。
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
この記事を書いた時も発生したのですが、当初はlogback-classicとlogback-coreがslf4j-apiに含まれていると思っていました。
しかし実際に含まれていたのはspring-boot-starterで、logback-classic、logback-coreは本当は必須でした。