java logbackでログを別々のファイルに出力

logbackでログを別々のファイルに出力したい場合の設定方法をいつも忘れるのでメモ。

動作確認用のJAVAソース

package xxx;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import xxx.yyy.YYY;

public class LogBackTest {
	private static Logger log = LoggerFactory.getLogger(LogBackTest.class);
	
	public static void main(String args[]) {
		log.debug("debug");
		log.info("info");
		log.error("error");
		
		new YYY();
	}
}
package xxx.yyy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class YYY {
	private static Logger log = LoggerFactory.getLogger(YYY.class);
	
	public YYY() {
		log.debug("debug");
		log.info("info");
		log.error("error");
	}
}

rootの設定のみ

logbackの設定

<configuration debug="true"> 
   <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
    <file>./log/file1.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
   <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
    <file>./log/file2.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
  <root level="ERROR">
    <appender-ref ref="FILE1" />
    <appender-ref ref="FILE2" />
  </root>
</configuration>

rootのappender-refに従ってappenderのFILE1、FILE2に同じログが出力されている。

file1.log

23:20:44.903 ERROR xxx.LogBackTest[main] error
23:20:44.903 ERROR xxx.yyy.YYY[<init>] error

file2.log

23:20:44.903 ERROR xxx.LogBackTest[main] error
23:20:44.903 ERROR xxx.yyy.YYY[<init>] error

ロガーに対してappenderを1つだけ追加

logbackの設定

<configuration debug="true"> 
   <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
    <file>./log/file1.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
   <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
    <file>./log/file2.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
  <logger name="xxx" level="debug" additivity="false">
    <appender-ref ref="FILE1" />
  </logger>
  
  <root level="ERROR">
    <appender-ref ref="FILE1" />
    <appender-ref ref="FILE2" />
  </root>
</configuration>

ロガーに対してappenderのFILE1を指定したため、file2.logにはログ出力されなくなった。

file1.log

23:20:03.749 DEBUG xxx.LogBackTest[main] debug
23:20:03.749 INFO xxx.LogBackTest[main] info
23:20:03.749 ERROR xxx.LogBackTest[main] error
23:20:03.749 DEBUG xxx.yyy.YYY[<init>] debug
23:20:03.749 INFO xxx.yyy.YYY[<init>] info
23:20:03.749 ERROR xxx.yyy.YYY[<init>] error

file2.log

###空ファイル。ログの記録なし###

同じロガーに対してappenderをそれぞれ追加

logbackの設定

<configuration debug="true"> 
   <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
    <file>./log/file1.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
   <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
    <file>./log/file2.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
  <logger name="xxx" level="debug" additivity="false">
    <appender-ref ref="FILE1" />
  </logger>
  
  <logger name="xxx" level="debug" additivity="false">
    <appender-ref ref="FILE2" />
  </logger>
  
  <root level="ERROR">
    <appender-ref ref="FILE1" />
    <appender-ref ref="FILE2" />
  </root>
</configuration>

同じロガーを2つ作成することができるみたい。
ロガーに従って、appenderのFILE1、FILE2にログ出力されている。
また、xxx.yyyの仮想パッケージもロガーxxxの設定を引き継いでいる。

file1.log

23:22:48.243 DEBUG xxx.LogBackTest[main] debug
23:22:48.243 INFO xxx.LogBackTest[main] info
23:22:48.258 ERROR xxx.LogBackTest[main] error
23:22:48.258 DEBUG xxx.yyy.YYY[<init>] debug
23:22:48.258 INFO xxx.yyy.YYY[<init>] info
23:22:48.258 ERROR xxx.yyy.YYY[<init>] error

file2.log

23:22:48.243 DEBUG xxx.LogBackTest[main] debug
23:22:48.243 INFO xxx.LogBackTest[main] info
23:22:48.258 ERROR xxx.LogBackTest[main] error
23:22:48.258 DEBUG xxx.yyy.YYY[<init>] debug
23:22:48.258 INFO xxx.yyy.YYY[<init>] info
23:22:48.258 ERROR xxx.yyy.YYY[<init>] error

下層のロガーに対して別のappenderを追加

logbackの設定

<configuration debug="true"> 
   <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
    <file>./log/file1.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
   <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
    <file>./log/file2.log</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %level %logger[%method] %msg%n</pattern>
    </encoder>
  </appender>
  
  <logger name="xxx" level="debug" additivity="false">
    <appender-ref ref="FILE1" />
  </logger>
  
  <logger name="xxx.yyy" level="debug" additivity="false">
    <appender-ref ref="FILE2" />
  </logger>
  
  <root level="ERROR">
    <appender-ref ref="FILE1" />
    <appender-ref ref="FILE2" />
  </root>
</configuration>

ロガーxxxパッケージはappenderのFILE1のみにログ出力されている。
ロガーxxx.yyyパッケージはappenderのFILE2を設定したので、FILE2側にのみxxx.yyy.YYYクラスのログが出力されており、FILE1側には出力されていない。

file1.log

23:25:00.150 DEBUG xxx.LogBackTest[main] debug
23:25:00.150 INFO xxx.LogBackTest[main] info
23:25:00.150 ERROR xxx.LogBackTest[main] error

file2.log

23:25:00.150 DEBUG xxx.yyy.YYY[<init>] debug
23:25:00.166 INFO xxx.yyy.YYY[<init>] info
23:25:00.166 ERROR xxx.yyy.YYY[<init>] error