Struts2で slf4j+logback を使うには

提供: tknotebook
2016年12月10日 (土) 10:54時点におけるNakamuri (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

メインページ>コンピュータの部屋#Java>Struts2 Tips


struts2はcommon-loggingとlog4jを使いますが、最近はロギングに slf4j + logback を利用されている方が多いと思います。この記事では slf4j + logback を利用するための設定を紹介します。

必要なライブラリ

maven で生成したひな形 struts2 blank等は log4j-core を使っていますが、 log4j-core を抜き、その代わりに slf4j+logback, log4j-to-slf4j、log4j-api を使えば ログは全てlogback に送られます。以下にこれらの pom.xml の dependency の設定を示します。

        <dependency>
        	<groupId>ch.qos.logback</groupId>
        	<artifactId>logback-classic</artifactId>
        	<version>1.1.7</version>
        </dependency>
        <dependency>
        	<groupId>org.apache.logging.log4j</groupId>
        	<artifactId>log4j-to-slf4j</artifactId>
        	<version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.6.2</version>
        </dependency>

logback.xml

ログの出力先や形式はクラスパス内に置いた logback.xml で決まります。 どのようにするかはアプリケーションの用途などで決まりますが、とりあえず 以下に参考例を示しておきます。

この例では全てのログは標準出力と log/Trace.log に出力されます。

log/Rolling.logには INFOレベル以上のログが出力されます。 このログは一時間毎に Rolling-yyyy-MM-dd-hh.log という日付と時刻が入った形式に リネームされてローテーションします。 最大30個、つまり最低30時間分のログを保持します。

ログの出力場所はアプリのカレントディレクトリの直下ですが、LOG_DIRプロパティで 位置を固定するやり方もコメントに含ませてあります。

 <?xml version="1.0" encoding="UTF-8" ?>
 
 <!--suppress ALL -->
 <configuration>
 
     <!--変数の定義を行います。2行目は外部のプロパティファイルの内容から定義します。-->
     <property name="LOG_DIR" value="c:/logback_logs" />
 
     <!-- 標準出力に出力する設定です。-->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <!--アペンダでのレベル設定-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>TRACE</level>
         </filter>
         <target>System.out</target>
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
         </encoder>
         <withJasi>true</withJasi>
     </appender>
 
     <!--ログファイルを出力するシンプルな設定です。-->
     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <!--アペンダでのレベル設定-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>TRACE</level>
         </filter>
         <!--<file>${LOG_DIR}/Trace.log</file>-->
         <file>log/Trace.log</file>
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
         </encoder>
     </appender>
 
     <!--ログファイルをアーカイブする設定です。アーカイブは1時間毎に行います。-->
     <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <!--アペンダでのレベル設定-->
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>INFO</level>
         </filter>
         <!--<file>${LOG_DIR}/Rolling.log</file>-->
         <file>log/Rolling.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--<fileNamePattern>${LOG_DIR}/Rolling_%d{yyyy-MM-dd_HH}.log</fileNamePattern>-->
             <fileNamePattern>log/Rolling_%d{yyyy-MM-dd_HH}.log</fileNamePattern>
             <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern>
         </encoder>
     </appender>
 
     <!-- ルートから全てのログをアペンダに流し、アペンダでフィルタリングを行う方式とします。-->
     <root level="TRACE">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="FILE"/>
         <appender-ref ref="ROLLING"/>
     </root>
 </configuration>