現在ブリッジSEのyoshyです。今回は、社内でいつもお世話になっているKoji NISHIYAMAさんの英語記事を翻訳させていただき、JavaのロギングライブラリであるLogbackの設定ファイル(logback.xml)をTomcatのDocker環境においてをどう配置&適用するかご紹介します。
導入
Eclipse で Java アプリケーションを開発するとき、私は通常、logback.xml を src/main/resources の直下 (クラスパス上) に置きます。しかし、開発環境の以外のステージング環境や本番環境ではどこに配置すればよいでしょうか?![]()
LOGBACK.XML の場所について
ルールはここで確認できます。
以下は英語から日本語に翻訳したものになります。
- Logback は、クラスパス内で logback-test.xml というファイルを見つけようとします。
- そのようなファイルが見つからない場合、logback はクラスパス内で logback.groovy というファイルを見つけようとします。
- そのようなファイルが見つからない場合は、クラスパス内のファイル logback.xml がチェックされます。
- そのようなファイルが見つからない場合は、service-provider loading facility(JDK 1.6で導入)が使用されて、
com.qos.logback.classic.spi.Configuratorインターフェースの実装を解決します。このとき、クラスパス内のMETA-INF\services\ch.qos.logback.classic.spi.Configuratorファイルを検索し、その中には実装するConfiguratorの完全修飾クラス名が指定されている必要があります。- 上記のいずれも成功しない場合、Logbackは BasicConfigurator を使用して自動的に構成され、ログ出力がコンソールに送信されます。
開発中では 1 ~ 3 (Eclipse コンソールに出力したり、ファイルに出力したりすること)で十分です。
また、4 を使用することで、ステージング環境や本番環境で logback.xml の場所を設定することができます。
また、クラスパスに logback.xml がある場合でも、VM ランタイム引数として以下のように指定するだけでクラスパスよりも優先されることが確認できます。とても簡単です。
java -Dlogback.configurationFile=/usr/local/tomcat/conf/logback.xmlTOMCATのDockerコンテナに適用する
さて、私は Tomcat のDockerコンテナに war ファイルを配置して実行しようとしていました。ここからはTomcat のDockerコンテナに logback.xml の場所を指定する方法を解説します。
今回使用したDockerイメージは以下です。
https://hub.docker.com/_/tomcat
setenv.sh を使用して VM ランタイム引数を tomcat に設定します。
setenv.sh ファイルを bin ディレクトリに置くと、catalina.sh が自動的にロードしてくれます。
( catalina.sh とは上記の Tomcat コンテナの起動時に実行されるファイルです。)
以下がsetenv.sh の例です。
#!/bin/bash
JAVA_OPTS="-server \
-Dfile.encoding=UTF-8 \
-Dlogback.configurationFile=/usr/local/tomcat/conf/logback.xml"
次に、docker run コマンドを使用して、CATALINA_HOME の bin ディレクトリ直下にsetenv.shを配置します。また、合わせてコンテナ内にlogback.xmlとwarも配置しています。
docker run -p 8080:8080 -d \
-v /path/to/setenv.sh:/usr/local/tomcat/bin/setnev.sh \
-v /path/to/logback.xml:/usr/local/tomcat/conf/logback.xml \
-v /path/to/sample.war:/usr/local/tomcat/webapps/sample.war \
tomcat:8.5-jdk8-correttoそうすることで、logback.xml ファイルを Tomcat に渡すことができます。
ロードされたLOGBACK.XMLを確認します。
以下はうまく動作しない場合の参考にしてください。
logback.xml の読み込みステータスを確認するには、以下に示すように、logback.xml の設定タグの直下に statusListener タグを追加します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
...
</configuration>そうすることで、ログが logback.xml の場所を教えてくれます。
14:44:54,034 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
14:44:54,035 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
14:44:54,035 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/user/Develop/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/sample-front/WEB-INF/classes/logback.xml]
詳細については、「Status Listener」を参照してください。



