脇役だけどとても大事な機能たち
ログの出力
ログは全ての機能に対しての『目印』になる重要な役割があるので適切な設定を心がけましょう。
今回は『SLF4J』を使用したログの設定方法を解説します。
<!-- Logback (SLF4J の実装ライブラリ) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.14</version>
</dependency>
package view;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import dto.SampleDto;
import jakarta.inject.Inject;
import lombok.Getter;
@Named
@ViewScoped
public class SampleBean extends BaseBean {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(SampleBean.class);
@Inject
@Getter
private SampleDto dto;
@Override
protected void initialize() {
logger.info("処理を開始します。");
logger.info("{}を{}します。", "hoge", "foo");
dto.setName("");
dto.setMemo("");
}
public String submit() {
return SELF;
}
}
『getLogger(SampleBean.class)』の様に、自身のクラス名を引数として設定します。
ログ出力設定は、普通に文字列を設定します。
また『{}』を使って、プレースホルダ設定も可能です。
ログの種類と深度設定
debug 開発・デバッグ用
info 通常運用ログ
warn 警告
error エラー・障害発生
実はデフォルトの設定で、ログは『info』以上となっています。
しかも、この設定は『Wildfly』側にあります。 『Wildfly』側の設定を弄るのは『好手』ではありませんので、アプリ側からログの制御を無効にします。
以下ファイルを作成します。
『webapp/WEB-INF/jboss-deployment-structure.xml』
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<!-- WildFly のログサブシステムによる自動統合を無効化する -->
<exclude-subsystems>
<subsystem name="logging" />
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- コンソール(画面)に書き出す設定 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日付ごとにローテーションするファイル出力の設定 -->
<appender name="DAILY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 現在書き込み中のログファイルパス -->
<file>standalone/log/server.log</file>
<!-- ローテーション(世代管理)のポリシー設定 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 過去ログのファイル名パターン(日毎にアーカイブ化される) -->
<fileNamePattern>standalone/log/server.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- ログファイルを保持する日数(例: 30日分保管) -->
<maxHistory>30</maxHistory>
<!-- 保持するログファイルの総容量制限(オプション: 例 3GB) -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 出力レベルとアペンダーの関連付け -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="DAILY_FILE" />
</root>
</configuration>
特に気にする必要はないかと。
※本解説では[wildfly-28.0.1.Final]で設定しています
・fileNamePatternタグ ファイル名のパターンを設定します。
・maxHistoryタグ ログファイルを保持する日数です。
・totalSizeCapタグ ログファイルの容量制限です。
・encoderタグ 文字コード設定です。
またここで、アペンダーの関連付け設定もします。




『@Inject』を使って『Logger』クラスを注入する方法もありますが、当然静的クラスでは使えません。
また、サンプルのバッキングビーンは『BaseBean』を継承しています。記述の統一性の観点からも、こちらの設定をお勧めします。
これ一瞬『[protected]にしてBaseBeanにロガーを設定すれば良いのでは?』と思いますよね。
ただしこの設定にしてしまうと、以下の様に発火したクラスが全て『BaseBean』となってしまいます。
08:32:06,058 INFO [view.BaseBean] (default task-1) 処理を開始します。 ログの意味は、システム監視にあるので、視認性を担保するためにも『private』設定にしましょう。