実行可能な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