2026年1月18日日曜日

【Java】ログ出力の「正解」を探求:Log4j 2の導入から「消えないログ」の運用術まで

1. 導入:その設定、昨日のログを消していませんか?

「しまった、昨日のエラーログが消えてる……!」

以前、私はログの設定を誤り、プログラムを起動するたびにログファイルを「上書き」してしまう設定にしていました。バグの原因を調査しようと再起動した瞬間、手がかりだった過去のログがすべて消え去ったあの絶望感……。

プロの現場では、ログは「証拠」です。今回は、二度とそんな悲劇を起こさないために、Javaのロギングライブラリ Log4j 2 を使い、正しく「追記」と「保存」を行う方法を探求します。


2. Log4j 2の導入:IntelliJへの組み込み

まずは環境構築から。自分でロガーを自作(車輪の再発明)せず、信頼されたライブラリを使います。

  1. Apache Log4j公式サイトからBinaryのzipをダウンロード。

  2. log4j-api-2.x.x.jarlog4j-core-2.x.x.jar をプロジェクトの lib フォルダ等に配置。

  3. IntelliJの「Project Structure」→「Libraries」から、これらを追加してクラスパスを通します。


3. 外部ファイル(log4j2.xml)で「追記」と「世代管理」を死守する

コードを一切触らずに出力形式を変えられるのが Log4j の魅力です。私の失敗を繰り返さないための設定がこちらです。

【設定例:src/main/resources/log4j2.xml】

XML
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_DIR">./logs</Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <RollingFile name="FileAppender" fileName="${LOG_DIR}/app.log"
                     filePattern="${LOG_DIR}/app-%d{yyyy-MM-dd}.log"
                     append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="FileAppender"/>
        </Root>
    </Loggers>
</Configuration>


4. 納得ポイント:上書き?追記?それともローリング?

私の失敗を分析してわかった、ログ保存の3つのパターンです。

  • 上書き(絶対ダメ!): 起動のたびに古いログをリセットする。調査中に再起動した瞬間、証拠が消滅します。

  • 追記(Append): ファイルの末尾に書き足していく。過去分は残りますが、1つのファイルが数GBに膨れ上がり、開けなくなるリスクがあります。

  • ローリング(プロの推奨): 今回設定した方法です。「追記」しつつ、日付が変わったら「別名(app-2026-01-17.logなど)」で保存し、新しいファイルを作り直します。


5. 実践:出力結果と「追記」の確認

検証コードを実行し、一度終了してから「再度」実行してみてください。

【実行後の./logs/app.logの中身】

Plaintext
2026-01-18 11:30:05 [main] INFO  LogTest - --- アプリケーション開始 ---
2026-01-18 11:30:05 [main] DEBUG LogTest - 計算実行: 10 / 0
2026-01-18 11:30:05 [main] ERROR LogTest - 計算中にエラーが発生しました。
... (一度終了) ...
2026-01-18 11:35:10 [main] INFO  LogTest - --- アプリケーション開始 ---

append="true" のおかげで、前の実行記録が消えずに残っています!これなら、安心して再起動して調査ができます。

6. まとめ:ログは「未来の自分」を助ける唯一の手段

「昨日のログを上書きして消してしまった」という苦い経験があったからこそ、Log4jのようなライブラリが提供する「追記」や「ローリング」の機能がいかに有り難いか、心から納得できました。

適切なログ設計は、トラブルが起きた時に「過去の自分」から届く、最高のプレゼントになります。皆さんも、まずは append="true" とローリングの設定を確認することから始めてみてください!




0 件のコメント:

コメントを投稿

【Java】「あれ、時間が違う?」の謎を解く。OSとJavaが時刻を判断する仕組みとモダンな修正術

1. 導入:9時間のズレが教えてくれたこと ローカルのPCでは正しく動いていたのに、サーバー(Linux)に持っていった途端、時刻が9時間ズレて表示される……。 そんな経験はありませんか?私はあります。この「9時間」という数字は、日本標準時(JST)と協定世界時(UTC)の差。 ...