【SE入門編】【番外編】MybatisのSQL文をLOG4J2ログに出力する

## 前書き

今回の記事は「SE入門編」シリーズの一部です。完全版はこちらにあります：

https://qiita.com/manabu-s/items/2f7f10752bcf44244718

今回の記事のソースはGithubにアップロードしております：

https://github.com/yoruzuki/WebService_Spring/tree/main/demo%20ver0.5

## 1. 前提条件

今回の記事は【番外編】となっており、MybatisとLOG4J2の知識があれば十分です。

Mybatisのログレベルの理解：
- ログレベル＝DEBUG:実行されるＳＱＬ文やパラメータが出力される
- ログレベル＝TRACE:ＳＱＬ文の実行結果（検索データ、件数など）が出力される

ただし、既に本編で構築したソースの上に、SQL文をログに出力するように追加を設定したため、興味をお持ちの方は本編から着手してください。


## ２. 今回の記事で出来たこと
- 各トランザクションで発行されたＳＱＬ文をログ（コンソルやログファイル）に出力することが出来た

- ログ出力レベルを変えるだけで、出力内容が変わることが出来た

- ログ出力レベル＝traceを設定した時に出力されたログ：DEBUG、TRACEのログが出力される（実際にはERROR、WARN、INFOも出力されるが、今回は例を作ってなかったです）
```
2024-02-04 10:53:38.088, [demo], [ DEBUG ], com.example.demo.repository.UserRepository.selectByPK, ==>  Preparing: SELECT USER_ID, USER_NAME, PASSWORD, EMAIL, ROLE, TO_CHAR(LAST_LOGIN_DATE, 'YYYY/MM/DD HH24:MI:SS') LAST_LOGIN_DATE, LANG, DEL_FLG, DECODE(DEL_FLG, '1', 'Deleted', 'Active') DEL_FLG_TEXT, TO_CHAR(CREATE_DATE, 'YYYY/MM/DD HH24:MI:SS') CREATE_DATE, CREATE_USER, TO_CHAR(UPDATE_DATE, 'YYYY/MM/DD HH24:MI:SS') UPDATE_DATE, UPDATE_USER FROM USERS WHERE USER_ID = ? 
2024-02-04 10:53:38.096, [demo], [ DEBUG ], com.example.demo.repository.UserRepository.selectByPK, ==> Parameters: ADMIN(String) 
2024-02-04 10:53:38.103, [demo], [ TRACE ], com.example.demo.repository.UserRepository.selectByPK, <==    Columns: USER_ID, USER_NAME, PASSWORD, EMAIL, ROLE, LAST_LOGIN_DATE, LANG, DEL_FLG, DEL_FLG_TEXT, CREATE_DATE, CREATE_USER, UPDATE_DATE, UPDATE_USER 
2024-02-04 10:53:38.103, [demo], [ TRACE ], com.example.demo.repository.UserRepository.selectByPK, <==        Row: ADMIN, システム　管理者, ADMIN, admin@test.com, ADMIN, 2024/02/03 21:19:32, en, 0, Active, 2023/12/31 17:15:58, ADMIN, 2023/12/31 17:15:58, ADMIN 
```


- ログ出力レベル＝debugを設定した時に出力されたログ：DEBUGのログが出力される、TRACEのログが出力されない（実際にはERROR、WARN、INFOも出力されるが、今回は例を作ってなかったです）
```
2024-02-04 11:00:30.454, [demo], [ DEBUG ], com.example.demo.repository.UserRepository.selectByPK, ==>  Preparing: SELECT USER_ID, USER_NAME, PASSWORD, EMAIL, ROLE, TO_CHAR(LAST_LOGIN_DATE, 'YYYY/MM/DD HH24:MI:SS') LAST_LOGIN_DATE, LANG, DEL_FLG, DECODE(DEL_FLG, '1', 'Deleted', 'Active') DEL_FLG_TEXT, TO_CHAR(CREATE_DATE, 'YYYY/MM/DD HH24:MI:SS') CREATE_DATE, CREATE_USER, TO_CHAR(UPDATE_DATE, 'YYYY/MM/DD HH24:MI:SS') UPDATE_DATE, UPDATE_USER FROM USERS WHERE USER_ID = ? 
2024-02-04 11:00:30.454, [demo], [ DEBUG ], com.example.demo.repository.UserRepository.selectByPK, ==> Parameters: ADMIN(String) 
2024-02-04 11:00:30.456, [demo], [ DEBUG ], com.example.demo.repository.UserRepository.selectByPK, <==      Total: 1 
```

- ログ出力レベル＝infoを設定した時、DEBUG、TRACEのログが出力されない（実際にはERROR、WARNも出力されるが、今回は例を作ってなかったです）


## ３. 実装(設定)
SQL文をLOG4J2ログに出力するには２つファイルの設定が必要です。ファイルの位置は下図をご確認ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1442793/fe2033b4-a509-2bf9-3202-7b8c1a64bba1.png)


- log4j2.xml：
name：リポジトリのJAVAファイル名を指定するか、リポジトリのフォルダ（package）を指定するか。JAVAファイル名を指定した場合、指定されたJAVAファイル名だけのSQL文を出力する、packageを指定する場合、指定されたpackageの全てリポジトリのSQL文を出力する

level: 設定したレベルよりも高いレベルのログが出力されるため、本番環境ではSQL文を出力することでレスポンスに影響が生じる可能性があり、そのためには通常 level="info" で設定されます。一方、テスト環境では debug か trace を設定することが一般的です。

```
		<logger name="com.example.demo.repository" level="info" />
```

- mybatis-config.xml：ロギング実装をlog4j2で指定します
```
        <setting name="logImpl" value="LOG4J2"/>
```

## おわりに
プロジェクト全体のソースコードはGitHubにアップロードしました、ぜひダウンロードして確認してください。

https://github.com/yoruzuki/WebService_Spring/tree/main/demo%20ver0.5

それではまた。