Logbackでログ出力
今回はLogbackを使用してログを出力してみます。環境構築
Mavenのpom.xmlに以下を追加します。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>javaTest2</groupId>
<artifactId>javaTest2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</project>
logback.xmlの作成
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyyMMddHH}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
logback.xmlはクラスパスが通っている場所に置きます。わからなかったらsrcフォルダ直下に置いてください。
Javaファイルにログ出力処理の埋め込み
package javaTest2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
logger.trace("Test_trace");
logger.debug("Test_debug");
logger.info("Test_info");
logger.warn("Test_warn");
logger.error("Test_error");
}
}
コンソール出力
23:25:45.341 [main] DEBUG javaTest2.Test - Test_debug
23:25:45.345 [main] INFO javaTest2.Test - Test_info
23:25:45.345 [main] WARN javaTest2.Test - Test_warn
23:25:45.345 [main] ERROR javaTest2.Test - Test_error
ファイル出力
23:25:45.341 434 [main] DEBUG javaTest2.Test - Test_debug
23:25:45.345 438 [main] INFO javaTest2.Test - Test_info
23:25:45.345 438 [main] WARN javaTest2.Test - Test_warn
23:25:45.345 438 [main] ERROR javaTest2.Test - Test_error
<appender>
ログの出力方式、出力内容を定義します。classで出力先を指定します。
class | 出力先 |
---|---|
ch.qos.logback.core.ConsoleAppender | コンソールに出力 |
ch.qos.logback.core.rolling.RollingFileAppender | ファイルに出力 |
encoderのpatternで出力内容を定義します。
変換指定子 | 効果 |
---|---|
%d | 日時。{HH:mm:ss.SSS}を付けると時、分、秒、ミリ秒。 |
%relative | 経過時間。ミリ秒。 |
%thread | スレッド。 |
%level | DEBUG、INFOなど。 |
%logger | ログ出力クラス。{数値}クラスを出力する長さ。指定より長い場合はパケージ名を省略。{0}クラスのみ。 |
%msg | メッセージ。 |
%n | 改行。 |
%line | 行番号。遅い。 |
ファイル出力のみの設定
fileでログファイル名を指定します。
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">で古いログを別ファイルにすることができます。
指定 | 内容 |
---|---|
fileNamePattern | 過去ログファイル名を指定。拡張子を.zipにすると圧縮ファイルになります。 |
maxHistory | 過去ログファイルの最大数 |
totalSizeCap | 過去ログファイルの合計サイズ |
<root>
ログを出力するappenderを指定します。levelを指定すると指定したレベルとそれより上のレベルのみログを出力します。レベルの順
trace → debug → info → warn → error
logger
loggerを指定するとクラスやパッケージ毎にログを出力できます。loggerのnameには、クラス名やパッケージ名を指定できます。
JavaソースでLoggerFactory.getLoggerに自身のクラスを渡すと、loggerのnameと一致する設定のログが出力されます。
例えば、クラスが javaTest2.ko.TestKo の場合、loggerのnameを
javaTest2、javaTest2.ko、javaTest2.ko.TestKo のどれを指定してもログ出力対象になり、
設定したすべてで出力されます。
※ <root>の設定でも出力されます
loggerでもlevelの指定ができます。指定したlevelよりレベルの低いログはrootや親パッケージの設定でもログ出力されません。
additivity="false" を付けるとrootや親パッケージで指定したログの出力を行いません。
logback.xml
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyyMMddHH}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="javaTest2.ko.TestKo" additivity="false" level="debug">
<appender-ref ref="STDOUT" />
</logger>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
TestKo.java
package javaTest2.ko;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestKo {
static Logger logger = LoggerFactory.getLogger(TestKo.class);
public static void main(String[] args) {
logger.trace("Ko_trace");
logger.debug("Ko_debug");
logger.info("Ko_info");
logger.warn("Ko_warn");
logger.error("Ko_error");
}
}
ファイル出力(コンソールには出力されない)
09:16:47.113 328 [main] DEBUG javaTest2.ko.TestKo - Ko_debug
09:16:47.116 331 [main] INFO javaTest2.ko.TestKo - Ko_info
09:16:47.116 331 [main] WARN javaTest2.ko.TestKo - Ko_warn
09:16:47.116 331 [main] ERROR javaTest2.ko.TestKo - Ko_error
ページのトップへ戻る