はじめに
普段eclipseでjavaアプリの開発をしているときはsrc/main/resources直下(クラスパス上に)logback.xmlを置いています。ですが、開発環境以外ではどこに置けばいいのでしょうか?
tomcatのdockerコンテナ内にwarのアプリをデプロイしてlogback.xmlを反映させる方法を調べました。
logback.xmlを置く場所
こちらにルールが記載されています。
https://logback.qos.ch/manual/configuration_ja.html#auto_configuration
- logback はクラスパス上でlogback.groovyというファイルを探します。
- 見つからなかったら、今度はクラスパス上でlogback-test.xmlというファイルを探します。
- 見つからなかったら、今度はクラスパス上でlogback.xmlというファイルを探します。
- 何も見つからなかったら、自動的にBasicConfiguratorを使って設定します。ロギング出力は直接コンソールに出力されるようになります。
開発中は1~3で十分です。eclipseのコンソールに出力したり、ファイルに出力したりと。
ポイントは4です。評価環境や本番環境ではこの方法を使って、logback.xmlの場所を設定可能なんです。やり方は簡単です。VMの実行時引数に以下を指定するだけです。eclipseではサーバーの起動時設定でVM引数を設定できるので、試してみて下さい。仮にクラスパス上にlogback.xmlを置いていたとしても、この4の方法の設定が優先されることが確認できるかと思います。
java -Dlogback.configurationFile=/usr/local/tomcat/conf/logback.xml
dockerのtomcatコンテナに反映させる
さて、本題です。私はdockerのtomcatコンテナにwarをデプロイして実行しようとしていました。
このときにlogback.xmlの場所をどうやって渡すかです。
利用するコンテナイメージは以下になります。
https://hub.docker.com/_/tomcat
tomcatにVMの実行時引数を設定するにはsetenv.shを利用します。
こちらの記事が参考になりました。
http://asuwa.hatenablog.com/entry/20110629/1309356081
- クラスパス
まんま CLASSPATH。これは追加で指定したいでしょう。でも、catalina.sh 中でクリアされてしまう。なので、このスクリプトの外部からは指定できない。で、catalina.sh から呼ばれるスクリプトに、setclasspath.sh と setenv.sh がある。
setclasspath.sh には、デフォルトで色々書いてあるから、変更したくない(そもそも、既存のファイルに手を入れたくない)。こんな名称のくせに。。
bin の下に setenv.sh を作っておくと読んでくれるので、ここに指定するのがよいのではないかと思う(デフォルトでは setenv.sh は存在しない)。
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直下に配置します。
ついでに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
以上のようにすればtomcatに任意のlogback.xmlを渡すことが可能になります。
logback.xmlの読み込み状況を確認する
こちらはうまく反映されないときの参考になればと思い記載します。
logback.xmlの読込状況を確認するためには、
logback.xml内のconfigurationタグ直下に以下のように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/nishiyama/Develop/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/sample-front/WEB-INF/classes/logback.xml]
詳細はスタータスリスナーの登録についてを参照下さい。
https://logback.qos.ch/manual/configuration_ja.html#statusListener
以上