実行可能なjarでlogbackが正常に動作しない
slf4j+logbackな環境で、コマンド実行するプログラムを書いた際、
ログ出力がうまくいかず、苦労したので備忘録に。。。
"URL [rsrc:logback.xml] is not of type file"ってなに?
eclipseで実行していたときには、正常にロギングされていたのだが、
いざ、jarに固めコマンドプロンプトから実行すると、下図のエラー
メッセージが表示され、正常に動作させることが出来なかった。
コンソール出力されたメッセージを追ってみると以下のような
エラーメッセージを発見。
21:01:57,765 |-ERROR in ch.qos.logback.core.joran.spi.Configuration WatchList@12558d6 - URL [rsrc:logback.xml] is not of type fileここから長い調査の旅が始まったのですが、結論を説明するとコレ。
[LOGBACK-150] Logback complains if logback.xml is in a jar - QOS.ch JIRA
logback 0.9.28の既知のバグの様で、設定ファイルであるlogback.xmlが
JARやWARなど、アーカイブされている場合に発生するようです。
回避策
さてここで、logback.xmlファイルの設置場所について
もう一度考えると「CLASSPATHが通してある場所」である。
カレントディレクトリがデフォルトでCLASSPATHに含まれている事を
前提としてjarからlogback.xmlを排除し、カレントディレクトリに
生のlogback.xmlを配置することで正常に動作させることが出来た。
検証プログラム
ライブラリ
slf4j-api-1.6.1.jar
logback-core-0.9.28.jar
logbacl-classic-0.9.28.jar
プロジェクト構成
App.java
package example.logback_test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { private static Logger logger = LoggerFactory.getLogger(App.class); public static void main( String[] args ) { logger.info("Hello slf4j+logback World!!"); System.out.println( "Hello slf4j+logback World!!" ); } }
logback.xml
System.out [%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level] %class - %msg%n logs/applog.%d{yyyy-MM}.log 1 UTF-8 [%-5level][%d{yyyy-MM-dd HH:mm:ss.SSS}] %class - %msg%n