Engineering Note

プログラミングなどの技術的なメモ

Visual Studio Code(VS Code) + Maven + SLF4J(Logback)によるロギング環境の構築

本記事は、Microsoftにより開発されたソースコードエディタである「Visual Studio CodeVS Code」を用いて、Mavenプロジェクトからロギング環境構築を行うためのメモになります。

 

 

環境の準備

事前準備として以下のインストール作業を済ませておきます。

 

  1. Visual Studio CodeVS Code)のインストール
  2. JDKのインストールおよび環境変数の設定
  3. VS Code上でのJava Extension Packの追加

 

Mavenプロジェクトの作成

上記の事前準備が完了したら、VS Codeを起動します。

起動後にCtrl + Shift + pを入力すると、コマンドパレットという検索ウインドウが表示され、そこにmavenと入力すると検索候補が出てきますので、以下のMaven: Create Maven Projectを選択します。

 

fig1. コマンドパレットから検索

fig1. コマンドパレットから検索

次にSelect an archetype ...と表示されるので、ここでもmavenと入力すると、検索候補が出てきますので、以下のmaven-archetype-quickstartを選択します。

 

fig2. archetypeの選択

fig2. archetypeの選択

最後にSelect a version ...と表示されるので、ここでは以下の1.4を選択します。

 

fig3. versionの選択

fig3. versionの選択

 

上記の画面まで進むと、フォルダ選択ウインドウが開きますので、今回のプロジェクトを保存する任意のフォルダを指定し、Select Destination Folderをクリックします。

 

すると、VS Codeのビュー上のターミナルでmvnコマンドが実行され、pom.xmlと呼ばれるMavenの設定用ファイルの作成準備が始まります。

 

 Junit> cmd /c mvn archetype:generate -DarchetypeArtifactId="maven-archetype-quickstart" -DarchetypeGroupId="org.apache.maven.archetypes" -DarchetypeVersion="1.4"
 [INFO] Scanning for projects...
 [INFO]
 [INFO] ------------------< org.apache.maven:standalone-pom >-------------------
 [INFO] Building Maven Stub Project (No POM) 1
 [INFO] --------------------------------[ pom ]---------------------------------
 [INFO]
 [INFO] >>> maven-archetype-plugin:3.1.2:generate (default-cli) > generate-sources @ standalone-pom >>>
 [INFO]
 [INFO] <<< maven-archetype-plugin:3.1.2:generate (default-cli) < generate-sources @ standalone-pom <<<
 [INFO]
 [INFO]
 [INFO] --- maven-archetype-plugin:3.1.2:generate (default-cli) @ standalone-pom ---
 [INFO] Generating project in Interactive mode
 [INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.4] found in catalog remote

 

その後、インタラクティブモードに切り替わり、以下の情報の入力待ち状態になります。

 

 Define value for property 'groupId':
 Define value for property 'artifactId':
 Define value for property 'version' 1.0-SNAPSHOT:
 Define value for property 'package' test:

 

 groupIdは、プロジェクトの識別子となり、主にプロジェクトのルートパッケージ名を使うのが一般的とされています。

今回はtestとしました。

 

artifactIdは、出力する成果物の名称に使われるID(jarファイルやwarファイルのバージョン抜きのファイル名)となります。

今回はtestとしました。

 

versionは、ビルド対象のアプリケーション(プロジェクト)のバージョンになります。

何も入力なしにEnterを押下すると、デフォルトで1.0-SNAPSHOTとなります。

 

packageは、パッケージ名となり、何も入力なしにEnterを押下すると、上記で入力したtestとなります。

 

ここまで入力が完了したら、以下の確認画面が表示されます。

 

 Confirm properties configuration:
 groupId: test
 artifactId: test
 version: 1.0-SNAPSHOT
 package: test
  Y:

 

問題が無ければそのままEnterを押下し、プロジェクトを作成します。

成功すれば[INFO] BUILD SUCCESSの文字が出力され、プロジェクトの作成が完了し、以下のようなフォルダ構成になります。

 

fig4. testプロジェクトのフォルダ構成

fig4. testプロジェクトのフォルダ構成

 

※ビュー上のPROBLEMSとして、コンパイラのバージョンの違いに関しての警告が出る場合は、pom.xml<properties>タグ内を以下のように修正します(使用しているJDKのバージョンに合わせます)。

 

 // pom.xml
...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>
...

 

依存するライブラリの追加

今回はLog4jの後継のロギングライブラリであるSLF4JとLogbackというものを組み合わせてログ環境を構築していきます。

pom.xmlに以下を追記します。

 

 // pom.xml
...
    <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.7</version>
    </dependency>
  </dependencies>
...

 

設定ファイルの作成

ログの出力に関するフォーマットや管理方法については、logback.xmlという設定ファイルに記述をしていきます。

デフォルトでは、src/main直下にresourcesというディレクトリを作成し、同ディレクトリ直下に保存します。

 

 // logback.xml
<?xml version="1.0" encoding="UTF-8" ?>

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

</configuration>

 

テストコードの作成

次にテストコードを作成します。

今回はログレベルINFOにて、アプリケーションの起動及び終了をターミナル上(標準出力)に出力するものを作成します。

 //LogbackTest.java
package test;

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

public class LogbackTest
{
    private static final Logger logger = LoggerFactory.getLogger(LogbackTest.class);
    public static void main( String[] args )
    {
        logger.info("アプリケーションを実行しました。");
        logger.info("アプリケーションを終了しました。");
    }
}

 

プログラムの実行

上記のテストコードが実装出来たら、いよいよテストを実行します。

実行するとターミナル上で以下のログが出力されます。

 

 2021-01-24 19:19:42,711 [main] INFO  test.LogbackTest - アプリケーションを実行しました。
 2021-01-24 19:19:42,714 [main] INFO  test.LogbackTest - アプリケーションを終了しました。

 

ログファイルに出力する

上記ではターミナル上に出力しただけですが、ログ自体は基本的にファイルにし出力し、設定した日数でローテートをしながら管理をしていきます。

上記で作成したlogback.xmlにファイルに出力するためのappenderを追記していきます。

 

 // logback.xml
<?xml version="1.0" encoding="UTF-8" ?>

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date [%thread] %-5level %logger{35} - %message%n</pattern>
        </encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/logtest.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/logtest.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{35} - %message%n</pattern>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

 

上記にて修正した後にプログラムを再度実行すると、ターミナル上にログが出力され、同じ内容のものがlogs/logtest.logにも書き込まれます。

 2021-01-24 19:27:31,491 [main] INFO  test.LogbackTest - アプリケーションを実行しました。
 2021-01-24 19:27:31,494 [main] INFO  test.LogbackTest - アプリケーションを終了しました。
 $ cat logs/logtest.log 
 2021-01-24 19:27:31,491 [main] INFO  test.LogbackTest - アプリケーションを実行しました。
 2021-01-24 19:27:31,494 [main] INFO  test.LogbackTest - アプリケーションを終了しました。

 

参考書籍

Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで