로깅
로깅 (Logging)
Druid 서비스가 디버깅을 돕기 위해 내보내는 로그와 메트릭, 그리고 log4j2 기반 로깅 설정 방법을 다룹니다. 기본 로그 설정, 로그 디렉터리 변경, 비동기 로그 설정을 설명해요.
출처: 문서
본문
아파치 Druid 서비스는 디버깅을 돕기 위한 로그를 내보냅니다. 같은 서비스들은 주기적으로 자신의 상태에 대한 메트릭도 내보내요. 메트릭 정보 로그를 끄려면 다음 런타임 속성을 설정하세요: -Ddruid.emitter.logging.logLevel=debug.
Druid는 로깅에 log4j2를 사용합니다. 기본 설정 파일 log4j2.xml은 Druid와 함께 다음 경로에 포함돼 있습니다: conf/druid/{config}/_common/log4j2.xml.
기본적으로 Druid는 RollingRandomAccessFile을 사용해 매일 로그를 롤오버(rollover)하고, 로그 파일을 최대 7일간 보관합니다. 이 방식이 적합하지 않다면 log4j2.xml을 그에 맞게 수정하세요.
다음 예시 log4j2.xml은 micro quickstart를 기준으로 합니다.
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN">
<Properties>
<!-- to change log directory, set DRUID_LOG_DIR environment variable to your directory before launching Druid -->
<Property name="druid.log.path" value="log" />
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601} %p [%t] %c -%notEmpty{ [%markerSimpleName]} %m%n"/>
</Console>
<!-- Rolling Files-->
<RollingRandomAccessFile name="FileAppender"
fileName="${sys:druid.log.path}/${sys:druid.node.type}.log"
filePattern="${sys:druid.log.path}/${sys:druid.node.type}.%d{yyyyMMdd}.log">
<PatternLayout pattern="%d{ISO8601} %p [%t] %c -%notEmpty{ [%markerSimpleName]} %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${sys:druid.log.path}/" maxDepth="1">
<IfFileName glob="*.log" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="FileAppender"/>
</Root>
<!-- Set level="debug" to see stack traces for query errors -->
<Logger name="org.apache.druid.server.QueryResource" level="info" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
<Logger name="org.apache.druid.server.QueryLifecycle" level="info" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
<!-- Set level="debug" or "trace" to see more Coordinator details (segment balancing, load/drop rules, etc) -->
<Logger name="org.apache.druid.server.coordinator" level="info" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
<!-- Set level="debug" to see low-level details about segments and ingestion -->
<Logger name="org.apache.druid.segment" level="info" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
<!-- Set level="debug" to see more information about extension initialization -->
<Logger name="org.apache.druid.initialization" level="info" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
<!-- Quieter logging at startup -->
<Logger name="com.sun.jersey.guice" level="warn" additivity="false">
<AppenderRef ref="FileAppender"/>
</Logger>
</Loggers>
</Configuration>
Peon은 항상 로그를 표준 출력(standard output)으로 내보냅니다. Middle Manager는 태스크 로그를 표준 출력에서 장기 저장소로 리다이렉트합니다.
참고: Druid는 task peon 프로세스를 포함한 모든 서비스가 log4j 구성 파일을 공유합니다. 다만 peon 프로세스의 logger에는 반드시 콘솔 appender를 정의해야 해요. 콘솔 appender를 정의하지 않으면, Druid가 로그 레벨(예:
info또는warn)은 유지하되 다른 appender(비콘솔 포함) 구성은 유지하지 않는 새 콘솔 appender를 만들어 설정합니다.
로그 디렉터리
포함된 Druid 및 ZooKeeper용 log4j2.xml 구성은 배포판 루트의 로그 디렉터리에 로그를 기록합니다.
로그 디렉터리를 변경하려면 Druid를 시작하기 전에 환경 변수 DRUID_LOG_DIR을 원하는 디렉터리로 설정하세요.
올인원(all-in-one) 시작 명령
bin/start-micro-quickstart 같은 올인원 시작 명령을 사용하면 각 서비스의 기본 구성에 두 종류의 로그 파일이 생깁니다. log4j2가 주요 로그 파일을 쓰고 주기적으로 롤오버해요. 예를 들어 log/historical.log입니다.
보조 로그 파일에는 log4j2를 거치지 않고 컴포넌트가 표준 출력이나 표준 에러에 직접 쓴 내용이 들어갑니다. 예를 들어 log/historical.stdout.log입니다. 여기에는 주로 Java 런타임 자체의 메시지가 포함돼요. 이 파일은 롤오버되지 않지만 메시지 양이 적어 일반적으로 크기가 작습니다. 필요하다면 Linux 명령 truncate --size 0 log/historical.stdout.log로 잘라낼 수 있어요.
로그를 비동기로 작성하도록 설정
로그가 정말 많다면 비동기로 작성하도록 설정할 수 있어요. 다음 예시는 로그가 많은 일부 클래스를 비동기로 작성하도록 구성한 log4j2.xml입니다.
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601} %p [%t] %c -%notEmpty{ [%markerSimpleName]} %m%n"/>
</Console>
</Appenders>
<Loggers>
<!-- AsyncLogger instead of Logger -->
<AsyncLogger name="org.apache.druid.curator.inventory.CuratorInventoryManager" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<AsyncLogger name="org.apache.druid.client.BatchServerInventoryView" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<!-- Make extra sure nobody adds logs in a bad way that can hurt performance -->
<AsyncLogger name="org.apache.druid.client.ServerInventoryView" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<AsyncLogger name ="org.apache.druid.java.util.http.client.pool.ChannelResourceFactory" level="info" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
더 알아보기 (Learn more)
- 각 서비스별 로그 위치와 기본 설정은 configuration 문서를 참고하세요.
- 메트릭 내보내기(emitter) 설정은 configuration 문서의 관련 섹션을 확인해 보세요.