サンプルコード †
- App.java
package com.mycompany.logbackexam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
public class App {
private static Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
try {
MDC.put("User", "Hiromi");
Marker urgent = MarkerFactory.getMarker("URGENT");
//slf4j には fatal は無い
//logger.fatal("本当にやばいログ");
logger.error(urgent, "本当にやばい。夜中でも運用担当者を呼び出せ!");
logger.error("普通にやばいログ");
logger.warn("ちょっとやばいログ");
logger.info("運用時に必要なログ");
logger.debug("開発時に必要なログ");
logger.trace("デスマ時に必要なログ");
} finally {
MDC.clear();
}
}
}
- logback.xml
<configuration>
<appender name="STDOUT1" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>*LOGGER1* %-5level [%X{User}] %-20logger{20} %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT1" />
</root>
</configuration>
- 出力
*LOGGER1* ERROR [Hiromi] c.m.logbackexam.App 本当にやばい。夜中でも運用担当者を呼び出せ!
*LOGGER1* ERROR [Hiromi] c.m.logbackexam.App 普通にやばいログ
*LOGGER1* WARN [Hiromi] c.m.logbackexam.App ちょっとやばいログ
*LOGGER1* INFO [Hiromi] c.m.logbackexam.App 運用時に必要なログ
*LOGGER1* DEBUG [Hiromi] c.m.logbackexam.App 開発時に必要なログ
Marker でフィルタリング †
<configuration>
<appender name="STDOUT1" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return null != marker && marker.contains("URGENT");</expression>
</evaluator>
<OnMismatch>ACCEPT</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<encoder>
<pattern>%cyan(*LOGGER1* %-5level [%X{User}] %-20logger{20} %msg) %n</pattern>
</encoder>
</appender>
<appender name="STDOUT2" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return null != marker && marker.contains("URGENT");</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
<encoder>
<pattern>%red(*LOGGER2* %-5level [%X{User}] %-20logger{20} %msg) %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT1" />
<appender-ref ref="STDOUT2" />
</root>
</configuration>

MDC でフィルタリング †
turboFilter は使わないの? †
- turboFilter は、configuration の子要素
- appender の子要素にはできない
- つまり、logback.xml 全体に設定される
MDCInsertingServletFilter? †
Java#Jakarta