Javaプログラムでログを出力する際に人気のある,sl4j+logbackを組み合わせた方法を紹介します.
目次
sl4jとlogbackの関係
- SLF4Jはロギングシステム用のシンプルなファサードです。
- ファサードとはデザインパターンのひとつで、様々なクラス群をまとめてアプリケーションに対して一つの窓口の役割を果たします。
- SLF4Jを通じて利用されるロギングシステムの実態がlogbackやlog4jです。
以下がイメージです。
application → slf4j → logback
pom.xml
Mavenの場合
pom.xml
にdependencyを追加します。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.4.5</version>
</dependency>
gradleの場合
build.gradle
に以下を追加します。
dependencies {
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.6'
implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.4.5'
implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.5'
}
logback.xml
logbackファイルの置き場所
gradle/mavenプロジェクトの場合は、logback.xmlを以下に配置します。
src/main/resources/logback.xml
logback.xml
logback.xmlの設定です。
<configuration>
<!-- ディレクトリの末尾の/を忘れない。 -->
<property name="logDir" value="./log/" />
<property name="fileName" value="application.log" />
<property name="format1" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%-4p] [%c] %m%n" />
<!-- ファイル出力の際のログ設定 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${format1}</pattern>
</encoder>
</appender>
<!-- 標準出力の際のログ設定 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${format1}</pattern>
</encoder>
</appender>
<!-- 出力するレベルの指定 -->
<!-- 下記の例ではINFOレベルを指定しているので、INFO, WARN, ERRORレベルのログが出力され、DEBUGレベル以下のログは出力されません。 -->
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
<!-- 不要なログ出力を抑制 -->
<logger name="io.grpc.netty.shaded.io" level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="CLOUD" />
</logger>
</configuration>
ログ出力のサンプルコード
インスタンス変数としてloggerを呼び出す場合
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogSample {
Logger logger = LoggerFactory.getLogger(getClass());
public static void main( String[] args ) throws Exception {
LogSample logSample = new LogSample();
Logger logger = logSample.logger;
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}
Static変数としてloggerを呼び出す場合
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogSample {
private static final Logger logger = LoggerFactory.getLogger("TestLog");
public static void main( String[] args ) throws Exception {
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}
ローカル変数としてloggerを呼び出す場合
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogSample {
public static void main( String[] args ) throws Exception {
Logger logger = LoggerFactory.getLogger(LogSample.class);
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}
ログの出力結果
2022/12/26 18:37:37.695 [DEBUG] [LogSample] debug
2022/12/26 18:37:37.695 [INFO] [LogSample] info
2022/12/26 18:37:37.695 [WARN] [LogSample] warn
2022/12/26 18:37:37.695 [ERROR] [LogSample] error
標準出力に加え、./log/application.log.YYYY-MM-DD.log
にもログファイルが出力されれば成功です。