Casual Developers Note

エンジニアやデザイナー向けの技術情報・英語学習情報・海外留学情報・海外旅行情報を提供中。世界を旅して人生を楽しもう。

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • お問い合わせ
現在の場所:ホーム / アーカイブlombok

2018年7月30日 By KD コメントを書く

SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)

SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)

アプリケーションにおいてロギング処理は無くてはならない必需品です。現在ではログは故障の解析はもちろんのこと、セキュリティチェックやユーザの行動分析など多岐に渡って利用されています。今回はJavaによるロギング方法として、SLF4JとLogback、Lombokを使った方法を紹介します。

はじめに

Javaのロギングは、一昔前はCommons-loggingとLog4jによる方法が一般的でしたが、現在ではSLF4J+Logbackに取って代わりました。ベースは全てLog4jなので、乗り換える人も特に苦はありません。今回は、SLF4J+Logbackによるロギング方法を紹介します。ついでに、Lombokで簡潔に記述してみましょう。

SLF4Jとは?

SLF4Jは、Javaのロギング用のファサードAPIです。一昔前のCommons-loggingに該当します。役割としては、ライブラリが使っているロギングの実装が異なっていた場合に、インターフェースを統一するためのものです。

Logbackとは?

Logbackは、Javaのロギングの実装です。一昔前のLog4Jに該当します。SLF4Jと一緒に使う前提で作られており、特徴としてはアダプタによるログの横取りにより、他のロギングライブラリを使っているライブラリとログ出力を統一できます。

Lombokとは?

Lombokとは、一般的なボイラープレートをアノテーションで省略できるようにするライブラリです。例えば、よく書くゲッターやセッターが必要な場面では、@Getterや@Setter、@Dataのアノテーションを書くだけで実現できます。そして、SLF4J用に@Slf4jのアノテーションが提供されているので、今回利用します。

SLF4JとLogbackによるロギング

前提

以下がインストールされている前提で進めます。

  • Java10
  • Maven3

細かいバージョンは「環境」を参照して下さい。

サンプルアプリケーションを作る

それでは、雛形を作りましょう。

$ mvn -B archetype:generate \
> -DarchetypeGroupId=org.apache.maven.archetypes \
> -DgroupId=com.example.project \
> -DartifactId=logging-sample-app   
$ cd logging-sample-app/
$ rm src/main/java/com/example/project/App.java
$ rm src/test/java/com/example/project/AppTest.java
$ touch src/main/java/com/example/project/Main.java
$ mkdir -p src/main/resources
$ touch src/main/resources/logback.xml
$ tree src/main/
src/main/
├── java
│   └── com
│       └── example
│           └── project
│               └── Main.java
└── resources
    └── logback.xml
$ tree
.
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── project
│   │   │               └── Main.java
│   │   └── resources
│   │       └── logback.xml
...

できました。

標準出力

それでは、標準出力にログを出力してみましょう。

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.project</groupId>
  <artifactId>logging-sample-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>logging-sample-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>10</java.version>
    <logback.version>1.2.3</logback.version>
    <lombok-version>1.18.0</lombok-version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok-version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <target>${java.version}</target>
          <source>${java.version}</source>
          <release>${java.version}</release>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Main.java

package com.example.project;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

  private final static Logger log = LoggerFactory.getLogger(Main.class);

  public static void main(String[] args) {
    log.info("{} starting...", "My logging process");

    log.trace("Tracing...");
    log.debug("Debugging...");
    log.warn("Warning...");
    log.error("Error handling...");

    log.info("{} done.", "My logging process");
  }

}

logback.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%date [%thread] [%-5level] %logger{40} = %message%n</pattern>
    </encoder>
  </appender>

  <logger name="com.example" level="DEBUG"/>

  <root level="INFO">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

実行してみましょう。

$ mvn clean install
$ mvn exec:java -Dexec.mainClass="com.example.project.Main"
...
2018-07-11 22:21:34,057 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process starting...
2018-07-11 22:21:34,060 [com.example.project.Main.main()] [DEBUG] com.example.project.Main = Debugging...
2018-07-11 22:21:34,061 [com.example.project.Main.main()] [WARN ] com.example.project.Main = Warning...
2018-07-11 22:21:34,061 [com.example.project.Main.main()] [ERROR] com.example.project.Main = Error handling...
2018-07-11 22:21:34,062 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process done.
...

エラーレベルをDEBUGにしたので、TRACE以外の全てのレベルのログが出力されました。

ファイル出力

次にファイルに出力してみましょう。アペンダーはRollingFileAppenderを、ポリシーはTimeBasedRollingPolicyを使います。詳しくは公式ドキュメントを参照して下さい。

logback.xml

<configuration>
  <property name="encoding" value="UTF-8"/>
  <property name="logPath" value="logs/"/>
  <property name="logFormat" value="%date [%thread] [%-5level] %logger{40} = %message%n"/>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>${logFormat}</pattern>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${logPath}app.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${logPath}app.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <charset>${encoding}</charset>
      <pattern>${logFormat}</pattern>
      <outputPatternAsHeader>true</outputPatternAsHeader>
    </encoder>
  </appender>

  <logger name="com.example" level="DEBUG"/>

  <root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </root>
</configuration>

実行してみましょう。

$ mvn clean install
$ mvn exec:java -Dexec.mainClass="com.example.project.Main"
...
$ tree logs/
logs/
└── app.log
$ cat logs/app.log
#logback.classic pattern: %date [%thread] [%-5level] %logger{40} = %message%n
2018-07-11 22:21:34,057 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process starting...
2018-07-11 22:21:34,060 [com.example.project.Main.main()] [DEBUG] com.example.project.Main = Debugging...
2018-07-11 22:21:34,061 [com.example.project.Main.main()] [WARN ] com.example.project.Main = Warning...
2018-07-11 22:21:34,061 [com.example.project.Main.main()] [ERROR] com.example.project.Main = Error handling...
2018-07-11 22:21:34,062 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process done.

ファイルにログが出力されました。

Lombokによる記述の簡略化

すでにPOMでLombokを追加してあるので、Main.javaで使ってみましょう。

Main.java

@Slf4jを使うことで、ロガーの定義を省略できます。

package com.example.project;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main {

  public static void main(String[] args) {
    log.info("{} starting...", "My logging process");

    log.trace("Tracing...");
    log.debug("Debugging...");
    log.warn("Warning...");
    log.error("Error handling...");

    log.info("{} done.", "My logging process");
  }

}

実行してみましょう。

$ mvn clean install
$ mvn exec:java -Dexec.mainClass="com.example.project.Main"
...
2018-07-11 22:35:34,612 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process starting...
2018-07-11 22:35:34,616 [com.example.project.Main.main()] [DEBUG] com.example.project.Main = Debugging...
2018-07-11 22:35:34,617 [com.example.project.Main.main()] [WARN ] com.example.project.Main = Warning...
2018-07-11 22:35:34,617 [com.example.project.Main.main()] [ERROR] com.example.project.Main = Error handling...
2018-07-11 22:35:34,617 [com.example.project.Main.main()] [INFO ] com.example.project.Main = My logging process done.
...

問題なく動きますね。

最後に

いかがでしたか?これでJavaの基本的なロギングの方法は理解できたと思います。何かアプリケーションを作る時はSystem.outを使わずにSLF4JとLogbackを使いましょう。では。

環境

  • JDK: openjdk 10.0.1 2018-04-17
  • Maven: Apache Maven 3.5.3
  • Logback-classic: 1.2.3
  • Lombok: 1.18.0

カテゴリ : 技術 Tips & Tutorials タグ : java, logback, logging, lombok, slf4j

ブログ更新情報や海外の関連情報などを配信する無料メルマガ

Sponsored Links

About Author

KD

世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。挑戦に終わりはない。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。

https://casualdevelopers.com/

最近の投稿

  • 2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年1月13日
  • 今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    2019年11月4日
  • ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    2019年10月30日
  • BashからZshに移行する方法(Mac編)

    BashからZshに移行する方法(Mac編)

    2019年10月21日
  • Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    2019年9月30日

カテゴリ

  • 技術 Tips & Tutorials (100)
  • 技術塾 (6)
  • ライフハック (26)
  • 海外留学 (12)
  • 英語学習 (3)
  • コラム (6)

アーカイブ

最高の学習のために

人気記事ランキング

  • MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
    MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
  • Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
    Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
  • SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
    SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
  • Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
    Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
  • SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)
    SLF4JとLogbackによるJavaのロギング入門(SLF4J + Logback + Lombok)
  • Amazon EC2インスタンスにSSHできなくなった時の対処法
    Amazon EC2インスタンスにSSHできなくなった時の対処法
  • SpringBootのProfile毎にプロパティを使い分ける3つの方法
    SpringBootのProfile毎にプロパティを使い分ける3つの方法
  • [tips][perl] Perlで文字コードをいい感じに処理する方法
    [tips][perl] Perlで文字コードをいい感じに処理する方法
  • 爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
    爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
  • Go言語のためのVisual Studio Codeの設定方法
    Go言語のためのVisual Studio Codeの設定方法

Bitcoin寄付 / BTC Donation

Bitcoinを寄付しよう

BTC
Select Payment Method
Personal Info

Donation Total: BTC 0.0010

このブログの運営のためにBitcoinでの寄付を募集しています。お気持ち程度の寄付を頂けると管理者の励みになります。

Bitcoin寄付について知りたい方はこちらの記事へ

ビットコイン取引ならここ

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • サイトマップ
  • タグ一覧
  • プライバシーポリシー
  • お問い合わせ

Copyright © 2023 KD - Casual Developers Notes