Javaプロジェクトでのデバッグについて学ぶ


# デバッグ関連：Javaプロジェクトでのデバッグについて学ぶ


---

### ◎ ロギング　Log4jの使い方

#### Log4j とは？　- ログ出力のライブラリ

ログには、ログの重要度を表すログレベルが存在します。
具体的には、INFO，DEBUG、TRACEというログレベル(ログの重要度)が存在します。
これらを重要度の大きい順に並べるとINFO，DEBUG，TRACEとなり，使い分けは次のように行います。（他にもfatal,error,warn 等がある）

<参考> http://www.nurs.or.jp/~sug/soft/log4j/log4j2.html


- INFO: 監視する必要のあるもの バッチ処理の定時報告など

- DEBUG: 障害発生時の原因特定として使うもの、おおよそ開発者が出力するログ　運用時は出力しない，または障害対応のために直近のもののみを保存する　保存時はファイルの容量に上限があるため，簡潔に記述する- -- 

- TRACE: ログの付帯情報 メッセージの量が多くて他のログレベルだと出力が躊躇われるログ

- FATAL: サービスが提供不可となるような致命的なもの 一般の開発者が使う機会はほとんど無い
 
- ERROR: メンテナンス，修正が必要となるようなもの バリデーションエラーのような想定内のエラーに対しては使用しない 不要にERRORレベルを指定すると，本当に修正が必要であるようなログを見逃してしまう可能性がある

- WARN: 不整合は生じていないものの正常ではないもの
ファイルの書き込みのリトライや通信の接続の中断など


```java=
// 例えば
publlic void readPage(int pages){
    for(int i=0; i<pages; i++){
        if(this.currentPage == this.maxPage){
            logger.warn("cannnot read pages more than {}", this.maxPage);
            break;
        }
        this.currentPage +=1;
        
        logger.debug("read a page {}", this.currentPage);
    }
    
    logger.info("read a page {}", this.currentPage);
}   


```


私は、Mavenというプロジェクト管理ツールを使用してプログラムのビルドを行っています。Log4j2 は標準のライブラリではないため、使用するには依存関係を定義する必要があります。Mavenを使っている場合は、pom.xml で次のように定義します。

```
<dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.0</version>
        </dependency>
</dependencies>

```

#### ロギングの設定

######　ロギングの設定方法について log4j2.propertiesファイルの書き方

Log4j 2はクラスパスと同じ階層にlog4j2.propertiesというファイルを置くことで設定を読み込むことが可能です。

**Appenderはログを目的の場所に書き込む役割**を持ちます。

Appenderを作成するには以下の形式で必要なプロパティを設定します。

```
appender.Appender名.プロパティ名 = 値
```

*Appender名には何を指定しても問題ない

プロパティの名前と意味は次の通りです。

type: 形式を指定する
name: 名前を指定する
layout: 出力のフォーマットを指定する

コンソールに出力するConsoleAppenderを指定するにはappender.Appender名.type = Consoleと記述する。

rootLoggerは全てのLoggerが継承するLoggerです。
rootLoggerにAppenderを設定するには以下のように記述します。

```
＜参考例 log4j2.properties＞

apender.Appender.type = Console
apender.Appender.name = testAppender
apender.Appender.layout.type = PatternLayout 
apender.Appender.pattern = %c: %m%n

apender.Appender.filter.threshold.type= ThresholdFilter
apender.Appender.filter.threshold.level= warn
```

```
rootLogger.appenderRef.Appender名.ref = Appender.name
```

Appender.nameはAppenderの定義のnameで指定したものを使用します。



```
＜参考例＞
# ファイル出力するログの設定

# Appenderの作成
appender.fileAppender.type = File
appender.fileAppender.name = FileAppender
# 出力ファイルの指定
appender.fileAppender.fileName = test.log
# WARN以上を出力
appender.fileAppender.filter.threshold.type = ThresholdFilter
appender.fileAppender.filter.threshold.level = warn

# パターンを指定する
appender.fileAppender.layout.type = PatternLayout
appender.fileAppender.layout.pattern = %c: %m%n

# Loggerの設定
logger.test.name = test
logger.test.level = all
# FileAppenderの指定
logger.test.appenderRef.fileAppender.ref = FileAppender

appender.consoleAppender.type = Console
appender.consoleAppender.name = ConsoleAppender
appender.consoleAppender.layout.type = PatternLayout
appender.consoleAppender.layout.pattern = %c: %m%n
rootLogger.appenderRef.consoleAppender.ref = ConsoleAppender
```