====== Logback AsyncAppender ======
* Logback의 비동기 어펜더 및 기타 고속 어펜더들
* 비동기 로깅의 경우 Method name, Line Number 등이 출력되지 않는다.
===== AsyncAppender =====
비동기 Appender는 확실히 빠르지만 부하가 심한 상황에서 WARN 이하 레벨의 로그는 기본적으로 20% 유실 될 수 있고, 비동기 큐에 로그가 쌓인 상태에서 프로세스가 종료되면 해당 로그는 기록되지 않고 종료된다.
groovy 방식 설정은 1.1 이후 버전부터 AsyncAppender 사용가능. appenderRef가 존재하지 않았기 때문.
import ch.qos.logback.classic.AsyncAppender
import ch.qos.logback.classic.PatternLayout
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.encoder.LayoutWrappingEncoder
appender("STDOUT", ConsoleAppender) {
encoder(LayoutWrappingEncoder) {
layout(PatternLayout) {
pattern = "${p} %m%n" // ${p} 잘못된 패턴인듯
}
}
}
appender("STDOUT-ASYNC", AsyncAppender) {
appenderRef('STDOUT')
}
root(DEBUG, ["STDOUT-ASYNC"])
* 기본적으로 AsyncAppender는 코드 정보(클래스,메소드,줄번호)를 남기지 않는데, ''includeCallerData=true''를 통해서 가능하다. 물론 성능저하가 발생할 것이다.
* 단, 하나의 로그를 Async가 아닌 Appender와 함께 호출하며 해당 Appender에서 이미 코드 정보를 읽어들였다면 AsyncAppender에서도 코드 정보를 자동으로 가지게 된다.
* Queue 크기는 ''queueSize'' 옵션으로 변경한다. 기본 ''256''. 적당히 증가시킨다. ''4096''?
* ''neverBlock=false'' 큐가 20%정도만 남으면 1차로 ERROR 보다 낮은 레벨의 로그를 버리고, ERROR 이상 레벨의 로그를 찍는데 그것도 꽉차면 blocking 상태가 된다. ''neverBlock=true'' 이면 그마저도 blocking 하지 않고 버려버린다.
===== Logstash - AsyncDisruptorAppender =====
* [[https://github.com/logstash/logstash-logback-encoder/blob/master/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java|AsyncDisruptorAppender]]
* [[https://github.com/logstash/logstash-logback-encoder|logstash-logback-encoder]] 프로젝트에 포함된 고성능 appender
===== Reactor Logback : 사용하지 말 것 =====
* https://github.com/reactor/reactor-addons/tree/master/reactor-logback
* **Deprecated 예정이므로 사용하지 말 것. Momory Leak도 있어보임** [[https://github.com/reactor/reactor-addons/issues/168| Memory leak with reactor-logback by using reactor.logback.AsyncAppender to log into separate file #168]]
* 기본 backlog 갯수가 100만개이다. 설정을 변경해야한다.
* groovy로 설정하려면 logback 1.1.3 버전 이상 필요. [[http://jira.qos.ch/browse/LOGBACK-1008|LOGBACK-1008]]
* [[https://mvnrepository.com/artifact/io.projectreactor.addons/reactor-logback|Maven Repository for reactor-logback]]
* 성능 테스트 결과 유실이 없게 설정할 경우 Reactor Logback이 Logback 기본 AsyncAppender보다 훨씬 빠르다.
* ''includeCallerData=false''에 따라 메소드 이름, 줄 번호 등이 출력되지 않는다. 대신 성능은 향상된다.
* [[https://github.com/reactor/reactor-addons/issues/168|Reactor Logback Memory Leak]] - 3.3 버전에서 해결 되는 듯.
* [[https://dzone.com/articles/ratpacked-use-asynchronous-logging|Ratpacked: Use Asynchronous Logging]]
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
65536
false