본 문서는 https://logback.qos.ch/manual/introduction.html을 번역/요약/정리/사견 추가한 글입니다.
1. Filter가 뭘까?
Chapter 2 마지막 부분에서 로깅 이벤트가 요청되면 먼저 로그를 남길지 말지 1차적으로 결정하는 필터를 거친다고 했습니다. 이 때 말씀드린 필터가 지금 알아볼 필터와 같은 것입니다.
2. logback-classic에서
Logback-classic은 2가지 종류의 필터를 제공합니다. Regular filter, turbo filter
3. Regular filters
Regular filter는 Filter 추상 클래스를 확장합니다. 이 클래스에선 ILoggingEvent를 인자로 받는 decide() 메소드 하나를 구현하면 됩니다. 이 메소드는 FilterReply enum(DENY, NEUTRAL, ACCEPT)를 반환합니다.
만약 결과가 DENY라면 뒤에 필터가 남아잇더라도 즉시 로그를 드랍합니다. 결과가 NEUTRAL이라면 남은 필터의 결과에 따릅니다. 결과가 ACCEPT라면 남은 필터에 상관없이 즉시 로깅 이벤트를 처리합니다.
필터들은 Appender에 붙을 수 있습니다.
3.1. custom filter 만들기
Filter를 확장해 decide()를 구현한 후, 다음과 같이 appender에 필터를 붙일 수 있습니다.
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="chapters.filters.SampleFilter" />
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="STDOUT" />
</root>
</configuration>
<filter> 안에 요소를 넣고 클래스에 적절한 setter를 지정해 필드를 채울수도 있습니다.
3.2. LevelFilter
LevelFilter는 정확한 레벨 매칭에 기반해 이벤트를 필터링합니다.
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
3.3. ThresholdFilter
지정한 레벨보다 낮으면 필터링합니다.
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
3.4. EvalutatorFilter
EvaluatorFilter는 EventEvaluaotr를 캡슐화하는 필터입니다. 이름에서도 알 수 있듯이 특정 조건에 따라 이벤트를 필터링합니다.
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>
e.level.toInt() >= WARN.toInt() && <!-- Stands for && in XML -->
!(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
4. TurboFilters
TurboFilter 객체들은 모두 TurboFilter 추상 클래스를 상속받습니다. Filte와 TurboFilter는 2가지 큰 차이점이 있습니다.
- TurboFilter는 logging context에 묶여 있습니다. 그래서 소속된 appender가 사용될 때뿐만 아니라 로깅 요청이 생길 때마다 호출됩니다.
- TurboFilter는 LoggingEvent가 생성되기 전에 호출됩니다.
4.1. 자신만의 turbo filter 만들기
TurboFilter 추상 클래스를 확장받아서 decide()를 구현하기만 하면 됩니다.
4.2. DuplicateMessageFilter
캐시에 이전 메시지를 저장해 특정 메시지가 특정 횟수 이상 출력되려고 할 때, 출력을 막는 필터입니다.
'Log > Logback Manual' 카테고리의 다른 글
Chapter 8. logback Mapped Diagnostic Contexts (0) | 2022.10.06 |
---|---|
Chapter 6. logback layouts (0) | 2022.10.03 |
Chapter 5. logback encoders (0) | 2022.10.03 |
Chapter 4. logback appenders (0) | 2022.10.02 |
Chapter 3. logback 설정 (0) | 2022.10.02 |