【Java】log4j

準備

〇パッケージをDL、解凍(ここではlog4j-1.2.17.zipを使用)
http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip

〇クラスパス追加
プロジェクトを右クリックからビルド・パスの構成
f:id:vist764:20200318234405p:plain:w400
外部JARの追加
f:id:vist764:20200318234552p:plain:w400
DLしたjarファイルを選択
f:id:vist764:20200318234706p:plain:w400

設定ファイルを作成

ファイル名:log4j.xml または log4j.properties
xmlとpropertiesとで記述方法が異なる(例はxmlパターン)
作成場所:クラスパス上(クラスパス上でない場合はソースで指定可能)

(前提知識)エラーレベル

FATAL 致命的なエラー。プログラムの異常終了を伴うようなもの
ERROR エラー。予期しないその他の実行時エラー
WARN 警告。異常とは言い切れないが正常とも異なる何らかの予期しない問題
INFO 情報。実行時の何らかの注目すべき事象(開始や終了など)
DEBUG デバッグ用の情報。システムの動作状況に関する詳細な情報
TRACE トレース情報。更に詳細な情報

設定ファイルの内容(appender箇所)

出力のパターンを指定する

コンソール出力(ConsoleAppender)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="stdout"/>
  </root>
</log4j:configuration>

<パラメータ>
・Target
  System.out:標準出力
  System.err:エラー出力
・Threshold
  出力するエラーレベルを指定(INFOならINFO以上が出力対象)

ファイル出力(FileAppender)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="file" class="org.apache.log4j.FileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <param name="Threshold" value="info" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="file"/>
  </root>
</log4j:configuration>

<パラメータ>
・File
  ファイル名を指定する。実行ディレクトリからの相対表記が可能
・Append
  true:追加モード
  false:非追加モード(毎回ファイルが作られる)
・Encoding
  エンコーディングを指定(デフォルトはシステムのデフォルトエンコーディング
・Threshold
  出力するエラーレベルを指定(INFOならINFO以上が出力対象)

ファイル出力 日付でローテーション(DailyRollingFileAppender)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="dailyRotation" class="org.apache.log4j.DailyRollingFileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <param name="Threshold" value="info" />
     <param name="DatePattern" value="'.'yyyy-MM-dd" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="dailyRotation" />
  </root>
</log4j:configuration>

<パラメータ>
・File
  ファイル名を指定する。実行ディレクトリからの相対表記が可能
・Append
  trueにしておく(falseだとファイルが新規で作られない)
・Encoding
  エンコーディングを指定(デフォルトはシステムのデフォルトエンコーディング
・Threshold
  出力するエラーレベルを指定(INFOならINFO以上が出力対象)
・DatePattern
  '.'yyyy-MM:月次でローテーション(ローテ後のファイル名:ファイル名.2006-06)
  '.'yyyy-MM-dd:日次でローテーション
  '.'yyyy-MM-dd-HH:毎時でローテーション
  '.'yyyy-MM-dd-HH-mm:毎分でローテーション
  '.'yyyy-MM-dd-a:毎日AM0:00とPM:12:00にローテンション
  '.'yyyy-ww:週次でローテーション

ファイル出力 ファイルサイズでローテーション(RollingFileAppender)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="sizeRotation" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="./sample.log" />
     <param name="Append" value="true" />
     <param name="Encoding" value="Shift_JIS" />
     <param name="Threshold" value="info" />
     <param name="MaxFileSize" value="10KB" />
     <param name="MaxBackupIndex" value="3" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
     </layout>
  </appender>

  <root>
    <appender-ref ref="sizeRotation" />
  </root>
</log4j:configuration>

<パラメータ>
・File
  ファイル名を指定する。実行ディレクトリからの相対表記が可能
・Append
  trueにしておく(falseだとファイルが新規で作られない)
・Encoding
  エンコーディングを指定(デフォルトはシステムのデフォルトエンコーディング
・Threshold
  出力するエラーレベルを指定(INFOならINFO以上が出力対象)
・MaxFileSize
  ローテンションするログファイルサイズを指定(2KB、5MBなど)
・MaxBackupIndex
  バックアップファイルの数を指定
  (例.2の場合、ログファイル.1→ログファイル.2とローテンションしていき、
     それ以上古くなると破棄される)

設定ファイルの内容(layout箇所)

出力内容を指定する

シンプルレイアウト(SimpleLayout)
     <layout class="org.apache.log4j.PatternLayout">
INFO - ログ出力
時間、スレッド名、カテゴリ名(TTCCLayout)
     <layout class="org.apache.log4j.TTCCLayout">
       <param name="CategoryPrefixing" value="true" />
       <param name="ThreadPrinting" value="true" />
       <param name="DateFormat" value="ISO8601" />
     </layout>
20 3月 2020 05:18:44,031 [main] INFO Test - ログ出力

<パラメータ>
・CategoryPrefixing
  true:カテゴリー名(Testの部分(Logger.getLoggerの引き数))を付ける
  false:カテゴリー名を付けない
・ThreadPrinting
  true:スレッド名([main] の部分)を付ける
  false:スレッド名を付けない
・DateFormat
  DATE:英米系の日時表記(20 3月 2020 05:41:52,419 INFO - ログ出力)
  RELATIVE:プロセス開始からの時間(2 INFO - ログ出力)
  ABSOLUTE:現在「時間」のみ(05:39:48,310 INFO - ログ出力)
  ISO8601:フルフォーマット(2020-03-20 05:40:24,880 INFO - ログ出力)

HTML形式(HTMLLayout)
     <layout class="org.apache.log4j.HTMLLayout">
XML形式(XMLLayout)
     <layout class="org.apache.log4j.XMLLayout">
ユーザでレイアウトを指定(PatternLayout)
     <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="[%-5p] [%d{yyyy/MM/dd HH:mm:ss.SSS}] [%c] [%t] - %m%n" />
     </layout>
[INFO ] [2020/03/20 23:32:04.346] [Test] [main] - ログ出力

<パラメータ>
・ConversionPattern
  %p:ログレベル(INFO)
  %d:日付(%d{yyyy/MM/dd HH:mm:ss.SSS})
  %c:カテゴリー名
  %t:スレッド名
  %m:ログメッセージ
  %n:改行コード
%と文字の間(組み合わせ可能)
「-」(左詰め)、「数字」(最小字数)、「.数字」(最大字数)

設定ファイルの内容(logger 、root箇所)

出力するロガーを指定

ルート

全て対象

<root>
  <level value ="info" />
  <appender-ref ref = "stdout" />
  <appender-ref ref = "file" />
</root>

<パラメータ>
 level:出力するエラーレベルを指定(INFOならINFO以上が出力対象)
 appender-ref:出力したいappender nameを指定

ロガー

ロガーで指定

  <logger name = "Test">
    <level value ="info" />
    <appender-ref ref = "stdout" />
  </logger>

<パラメータ>
 level:出力するエラーレベルを指定(INFOならINFO以上が出力対象)
 appender-ref:出力したいappender nameを指定

使用方法

class Test {
    private Logger log = Logger.getLogger(Test.class);

    void DisplayLog() {
        URL fileXmlUrl = Loader.getResource("log4j.xml");
        DOMConfigurator.configure(fileXmlUrl);
        log.info( "ログ出力" );

        try {
            FileReader r = new FileReader("sample.txt");
        } catch (Exception e) {
            log.error( "エラー", e );
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Test test = new Test();
        test.DisplayLog();
    }
}
[INFO ] [2020/03/21 01:20:25.614] [Test] [main] - ログ出力
[ERROR] [2020/03/21 01:20:25.616] [Test] [main] - エラー
java.io.FileNotFoundException: sample.txt (指定されたファイルが見つかりません。)
	at java.base/java.io.FileInputStream.open0(Native Method)
	at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
	at java.base/java.io.FileInputStream.(FileInputStream.java:157)
	at java.base/java.io.FileInputStream.(FileInputStream.java:112)
	at java.base/java.io.FileReader.(FileReader.java:60)
	at Test.DisplayLog(Main.java:17)
	at Main.main(Main.java:27)

point

第二引数にエラー内容を指定することが可能