複数war間でのlogback共有について

Tomcatサーバー上にlogback.xmlを配置し、複数warで共有する際のtips

## 環境
・SpringFramework5
・Tomcat9
・Slf4j
・logback

## サーバーに格納するもの
```
C:\opt\apache-tomcat-9.0.4  
   ├ bin
   │ ├ ●追加● setenv.bat
   │ └ (以下省略)
   │
   ├ lib
   │ ├ ●追加● slf4j-api-1.7.25.jar
   │ ├ ●追加● logback-classic-1.2.3.jar
   │ ├ ●追加● logback-core-1.2.3.jar
   │ └ (以下省略)
   │
   ├ ○仮配置○ logback.xml
   │
   └ (以下省略)
```

各war内のjarファイルはビルド時にwarに格納されないクラスパス上(lib/compile)に移動すること。
jarが重複している場合、アプリケーション起動時に以下のエラーメッセージが表示される。

```console
SLF4J: Class path contains multiple SLF4J bindings.															
SLF4J: Found binding in [jar:file:/C:/opt/apache-tomcat-9.0.4/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]															
SLF4J: Found binding in [jar:file:/C:/opt/apache-tomcat-9.0.4/webapps/myapps/WEB-INF/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]															
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.										
```

## ◆Tomcat実行時の起動オプションを追加する
startup.batから起動する場合は *${CATALINA_HOME}/bin/setenv.bat* ,
startup.shから起動する場合は *${CATALINA_HOME}/bin/setenv.sh* をそれぞれ作成し、その中で記載する。
（読み込み処理はcatalina.batの場合141行目あたり）

```bash:catalina.bat
rem Ensure that any user defined CLASSPATH variables are not used on startup,
rem but allow them to be specified in setenv.bat, in rare case when it is needed.
set CLASSPATH=

rem Get standard environment variables
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
:setenvDone
```

logbackファイルの指定方法は以下の2通り。

- **クラスパスを追加**  
※logback.xmlを配置するディレクトリを指定。Tomcatはここで指定したディレクトリ直下のみを読み込む。

```bash:setenv.bat
set CLASSPATH="%CATALINA_HOME%"
export CLASSPATH
```

- **logback設定ファイルパス設定を追加**  

```bash:setenv.bat
set CATALINA_OPTS="-Dlogback.configurationFile=%CATALINA_HOME%/logback.xml"
export CATALINA_OPTS
```

※ここで、exportをしないと環境変数への書き込みはされず、shell変数への設定になってしまうので注意。


### -Dlogback.configurationFileオプション設定時の起動時ログ

```console
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/9.0.4
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jan 18 2018 19:42:17 UTC
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         9.0.4.0
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Windows 10
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            10.0
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.161-1\jre
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_161-1-redhat-b14
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         C:\opt\apache-tomcat-9.0.4
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         C:\opt\apache-tomcat-9.0.4
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\opt\apache-tomcat-9.0.4\conf\logging.properties
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xdebug
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787

### 設定が反映されていることが確認出来る ###
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dlogback.configurationFile=C:\opt\apache-tomcat-9.0.4/logback.xml

25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
25-Oct-2018 15:02:39.475 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\opt\apache-tomcat-9.0.4
25-Oct-2018 15:02:39.491 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=C:\opt\apache-tomcat-9.0.4
25-Oct-2018 15:02:39.491 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=C:\opt\apache-tomcat-9.0.4\temp
```

## ◆logback.xmlのみwar外に配置する場合
logback,slf4jなどのjarはwar内に格納したまま、logback.xmlのみ任意ディレクトリに配置したい場合は、 ${CATALINA_HOME}/conf/context.xml に以下を追記する。

```xml
<Context>
    <!-- 中略 -->
    <Resources>
        <PreResources
            className="org.apache.catalina.webresources.DirResourceSet"
            base="C:\Users\user\Documents\smp\external"
            internalPath="/"
            webAppMount="/WEB-INF/classes" />
    </Resources>
</Context>
```
"base"に指定したディレクトリ直下も検索対象となる。
<Resources>タグが使用出来るようになるのはTomcat8以降。7以前とは書き方が異なるため注意。


## ◆参考
**Tomcatへのlogback設定について**

- [Logbackで設定ファイルを読み込む](http://tech.noriakihoriuchi.com/post/logback-configuration-initialization-steps)
- [TomcatのインストールとCATALINA_OPTSの設定](https://ti-tomo-knowledge.hatenablog.com/entry/2018/07/05/141158)
- [［set / export］環境変数を設定](https://tech.nikkeibp.co.jp/it/atcl/column/15/042000103/080700061/)
- [Tomcat8でlogback.xmlの設定が効かなくて1日ムダにしそうになる前に確認してほしいコト](https://qiita.com/nemuzuka/items/4cba3af26bc93b916c04)
- [tomcat8におけるJAVA_OPTSの設定方法](https://teratail.com/questions/74683)
- [UbuntuにおけるTomcatの覚え書き](https://qiita.com/hidekuro/items/119317f826253326e490)

**logback自体・SLF4Jについて**

- [logback機能,設定まとめ](https://qiita.com/rubytomato@github/items/93770f827e46cc7e684f)
- [SLF4J + Logbackでログ出力](http://tk5-21.hatenablog.com/entry/2017/06/15/223549)
- [javaのロガーが多すぎて訳が解らないので整理してみました](https://www.bunkei-programmer.net/entry/2012/10/20/java%E3%81%AE%E3%83%AD%E3%82%AC%E3%83%BC%E3%81%8C%E5%A4%9A%E3%81%99%E3%81%8E%E3%81%A6%E8%A8%B3%E3%81%8C%E8%A7%A3%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6)

**logbackの外出しについて**

- [Tomcat8で外部properties/xmlなどの設定方法](http://ryoichi0102.hatenablog.com/entry/2016/04/23/132957)
- [TOMCAT + logbackで、logback.xmlを外出し](http://www.dt8.jp/cgi-bin/adiary/adiary.cgi/0566)