logback.xmlからJNDIを使用してglassfishのCustom Resourceに登録した値を取得、変数代入する

# 1. はじめに
現在Javaでシステムを構築しており、ログ関連ライブラリにslf4j + logbackを使用しています。今までログ関連ライブラリの仕様について調べてなかったことに気づき、調査をしていました。その際、「logback.xmlでJNDIを使用して値を取得し、変数に代入できる。」と記載があったが、具体的な設定方法がわからず詰まったため備忘録として作成します。

# 2. 環境
- OS：Windows10  
- アプリケーションサーバ：glassfish-4.1.2  
- logback（logback-classic）：ver_1.2.3
- slf4j（slf4j-api）：ver_1.7.25

# 3. やりたいこと  
glassfishのCustom Resourceにアプリケーションログ出力先を設定する。
各アプリケーションは、Custom Resourceに設定したログ出力先を参照する。

# 4. glassfishの設定
1. glassfishの管理コンソールを開き、「JNDI」リンクをクリックする。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/1d39fc38-97ab-01cc-39b5-1c682febe3d1.jpeg)  

2. 「Custom Resources」リンクをクリックする。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/178fb078-6bdf-c5d5-7c46-c0b0a8de72af.jpeg)

3. 「New..」リンクをクリックする。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/b8b6029a-9081-0417-b06b-b0a3b3e881fe.jpeg)

4. 「JNDI Name」にapplogfile/dirを入力し、「Resource Type」はjava.lang.Stringを選択する。
    ※ 「Factory Class」は「Resource Type」を選択した際に、自動的に設定されました。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/78234916-0f63-fffc-4e59-aee5e1a1b77e.jpeg)

5. 「Add Property」ボタンを押下する。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/bfc4edc3-f53b-c18e-5974-7d44b283c042.jpeg)

6. 「Name」にvalue、「Value」にアプリケーションログ出力先のディレクトリを入力し、「OK」ボタンを押下する。
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/6fdbe14e-a7ff-dd6f-73db-9b085199fc3b.jpeg)

7. Custom Resoruces一覧ページに登録した内容が表示されていることを確認する。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/3f09f3f5-a64f-56ea-34c3-250ff0c52b99.jpeg)  

# 5. logback.xmlの設定
logback.xmlにJNDIを使用する以下の内容を記載する。

```xml:logback.xml
<configuration debug="true">
    <!-- 
        JNDIを使用して設定した値を取得する箇所
        env-entry-name:アプリケーションサーバに設定したJNDI Nameを指定する。
        as:JNDI経由で取得した値を格納する変数名を指定する。
    -->
    <insertFromJNDI env-entry-name="applogfile/dir" as="logdir" />    
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 
            変数を参照する箇所
        -->
        <file>${logdir}\\TEST.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="FILE" />
    </root>
</configuration>
```

# 6. 結果
・サンプルアプリケーションをglassfishにデプロイし、対象ディレクトリ（ここでは、B:\log）配下にTEST.logが出力されるかどうかを確認する。
・ログ出力内容を確認し、設定している内容が取得できているかどうかを確認する。

〇ログファイル出力確認
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/255593/af290ff3-b358-e25b-bf43-3f3cd5cea487.jpeg)

〇IDE（ここでは、NetBeans）のコンソールに出力した、ログ内容を確認

```
情報:   22:37:48,860 |-INFO in ch.qos.logback.classic.joran.action.InsertFromJNDIAction - Setting variable [logdir] to [B:\\log] in [LOCAL] scope
情報:   22:37:48,861 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
情報:   22:37:48,869 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
情報:   22:37:48,881 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
情報:   22:37:48,942 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [B:\\log\\TEST.log]
```

# 7. 参考サイト
〇glassfish関連
https://docs.oracle.com/cd/E19798-01/821-1752/giytz/index.html
〇logback関連
https://logback.qos.ch/manual/configuration_ja.html