Apache Druid 日志配置实战:log4j2.xml、指标与请求日志调优指南
数据库数据分析OLAP大数据实时分析数据仓库后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid7/druid点击查看免费下载Druid 节点Broker、Coordinator、Historical、MiddleManager 等在运行过程中会向控制台输出两类信息用于排错的调试日志以及反映节点运行状态的周期性子指标。本文以 Druid 官方 logging 配置文档 为核心系统讲解如何通过 log4j2.xml 覆盖默认日志配置、如何通过 JVM 参数接入 JUL 桥接、如何控制指标日志的级别以及如何开启请求级Query/HTTP日志。读完后你将能独立完成一个 Druid 集群各节点日志行为的完整定制。一、Druid 日志体系概览Druid 的日志体系由两层组成应用日志Application Logs各节点基于 log4j2 输出调试与运行信息默认打印到控制台SYSTEM_OUT。指标日志Metrics Logs节点周期性发射自身状态指标如查询数、缓存命中率、JVM 状态等默认同样打印到控制台。官方日志文档docs/content/configuration/logging.md明确指出指标日志默认打印到控制台并可通过-Ddruid.emitter.logging.logLeveldebug来调整其行为。这里的druid.emitter.logging.logLevel是一个标准的 Druid 运行配置项其完整取值与含义在 Configuration 文档 中有权威定义详见本文第五节。二、用 log4j2.xml 覆盖默认日志配置Druid 使用 log4j2 作为日志框架因此日志行为完全可以通过一个标准的log4j2.xml文件来定制。配置方式的核心要点如下编写一个log4j2.xml文件将该文件所在目录例如各节点配置目录下的_common/目录加入 classpath该目录必须排在 druid jars 之前否则 classpath 中更靠前的 jar 内嵌配置会抢先生效最简单的做法是在启动命令的 classpath前缀位置加上配置目录。从仓库自带的运行配置可以看出这一实践的具体落地方式examples/conf/druid/_common/log4j2.xmlexamples/conf示例集群共用的 log4j2 配置文件examples/conf-quickstart/druid/_common/log4j2.xml快速入门版conf-quickstart集群的对应文件。官方文档提到 Druid 自带示例配置位于config/_common/log4j2.xml在仓库中即以上述examples/conf/druid/_common/log4j2.xml与examples/conf-quickstart/druid/_common/log4j2.xml两份文件的形式随发行包提供。每个节点broker、coordinator、historical、middleManager、overlord的runtime.properties都依赖这份_common目录下的公共日志配置因此只需要维护一份即可统一整个集群的日志行为。三、完整示例 log4j2.xml 逐段详解官方日志文档给出了一份可完整复制使用的log4j2.xml仓库中 examples/conf/druid/_common/log4j2.xml 的内容与之完全一致。下面逐段拆解其含义?xml version1.0 encodingUTF-8 ? Configuration statusWARN Appenders Console nameConsole targetSYSTEM_OUT PatternLayout pattern%d{ISO8601} %p [%t] %c - %m%n/ /Console /Appenders Loggers Root levelinfo AppenderRef refConsole/ /Root !-- Uncomment to enable logging of all HTTP requests Logger nameio.druid.jetty.RequestLog additivityfalse levelDEBUG AppenderRef refConsole/ /Logger -- /Loggers /ConfigurationConfiguration statusWARNstatus控制 log4j2 自身内部日志的级别设为WARN可避免框架自身的噪音刷屏同时保留关键告警Appenders段声明一个名为Console的 Appender输出目标为SYSTEM_OUT标准输出PatternLayout pattern%d{ISO8601} %p [%t] %c - %m%n/定义每条日志的格式含义分别为%d{ISO8601}ISO8601 格式的时间戳%p日志级别DEBUG / INFO / WARN / ERROR%t产生日志的线程名%cLogger 的类名category%m日志消息正文%n换行符。Loggers段Root levelinfo将全局日志级别设为INFO并把所有日志交给ConsoleAppender 输出被注释的Logger nameio.druid.jetty.RequestLog ...这是一段非常有用的开关——取消注释并将其level设为DEBUG即可开启对所有 HTTP 请求的日志记录。additivityfalse表示该 Logger 的日志不再向 Root 重复传播避免重复输出。如果你想同时输出到文件便于采集与归档只需在Appenders段中增加一个RollingFileAppender 并在 Root 中追加AppenderRef即可模式与此完全一致。四、开启 JULjava.util.logging桥接Druid 内部部分组件走的是标准java.util.loggingJUL接口。若希望这些日志也能统一进入 log4j2 的管道需要设置如下 JVM 服务器参数-Djava.util.logging.managerorg.apache.logging.log4j.jul.LogManager该参数在节点启动时jvm.config或启动脚本的 JVM 参数区加入即可让 JUL 的日志记录统一由 log4j2 管理保证整个节点只有一套日志配置与格式避免“部分日志不受 log4j2.xml 控制”的割裂局面。五、指标Metrics日志与 Logging Emitter 配置Druid 节点周期性发射指标这些指标经由一个称为Emitter的组件输出。仓库中每个节点的common.runtime.properties都包含相关配置例如 examples/conf/druid/_common/common.runtime.properties 中就有druid.emitter.logging.logLevelinfo与之配套的完整参数表来自 Configuration 文档核心参数如下参数说明默认值druid.emitter设置为noop、logging或http可初始化对应的 emitter 模块composing可同时初始化多个 emitter 模块noopdruid.emitter.logging.loggerClass可选值HttpPostEmitter、LoggingEmitter、NoopServiceEmitter、ServiceEmitter指定日志输出使用的类LoggingEmitterdruid.emitter.logging.logLevel可选值debug、info、warn、error指定指标消息记录的日志级别info官方文档原文提到指标日志默认打印到控制台可通过-Ddruid.emitter.logging.logLeveldebug调整结合上表可以理解为druid.emitter默认即为日志输出方式logLevel决定了指标消息在 log4j2 管道中的记录级别。因此你既可以在common.runtime.properties中修改druid.emitter.logging.logLevel也可以在启动命令中用-D系统属性覆盖它——后者的优先级更高适合临时调试。从源码实现看Logging Emitter 的装配发生在 server/src/main/java/io/druid/server/initialization/LogEmitterModule.java该模块以druid.emitter.logging为前缀绑定LoggingEmitterConfig并通过 Guice 的Provides方法实例化LoggingEmitter交由生命周期管理。也就是说所有与druid.emitter.logging.*相关的属性都会自动注入到这个 emitter 的配置对象中。此外指标的产生频率与监控项也值得一并关注同样来自 Configuration 文档参数说明默认值druid.monitoring.emissionPeriod指标发射周期PT1mdruid.monitoring.monitors节点使用的监控器列表例如[com.metamx.metrics.JvmMonitor,com.metamx.metrics.SysMonitor]无不加载监控器六、请求日志Request Logging实战除了进程级日志Druid 还支持对所有能处理查询的节点Broker、Historical 等记录查询请求本身这在排查慢查询、定位请求来源时非常关键。相关配置同样集中在 Configuration 文档 的 Request Logging 一节。核心开关参数说明默认值druid.request.logging.type可选值noop、file、emitter、slf4j、filtered、composing决定查询请求的日志方式noop各类型要点file按天将请求日志落盘配合druid.request.logging.dir指定存储目录emitter将每个请求作为事件发送到外部druid.request.logging.feed指定 feed 名称slf4j通过 SLF4J 记录每个请求消息中以 JSON 序列化查询内容不受 SLF4J 格式规范限制日志归类到io.druid.server.log.LoggingRequestLoggerfiltered按druid.request.logging.queryTimeThresholdMs过滤仅记录 query/time 超过阈值的请求并可通过druid.request.logging.delegate委托给其它记录器composing通过druid.request.logging.loggerProviders同时向多个记录器输出。其中slf4j类型支持通过 MDC 增强日志字段便于在日志系统中做结构化检索参数说明默认值druid.request.logging.setMDC是否在日志条目中写入 MDC 字段需日志后端支持 MDC 格式化falsedruid.request.logging.setContextMDC是否把查询context加入 MDC仅在setMDC为true时生效falsesetMDCtrue时填充的 MDC 字段包括queryId查询 ID、dataSource查询的数据源、queryType查询类型、hasFilters是否带过滤条件、remoteAddr客户端地址、duration查询时间区间长度、resultOrdering结果排序方式、descending是否降序查询。从源码实现看server/src/main/java/io/druid/server/log/LoggingRequestLogger.java 正是slf4j类型的底层实现它在log()方法中把queryId、dataSource、queryType、hasFilters、remoteAddr、duration、descending以及当setContextMDC开启时查询 context 的每一项写入 MDC然后以LOG.info输出完整的RequestLogLine并在 finally 块中恢复调用前的 MDC 上下文。请求日志记录器本身的装配则由 server/src/main/java/io/druid/guice/QueryableModule.java 完成——它以druid.request.logging为前缀绑定RequestLoggerProvider并注册了file、emitter、slf4j、composing、filtered五种实现。除了查询请求若想记录所有HTTP 请求而不仅是查询则回到本文第三节提到的开关把io.druid.jetty.RequestLog这个 Logger 的级别设为DEBUG即可官方文档与 Configuration 文档 均如此说明。七、附加启动期属性日志与敏感信息脱敏在集群排查某个配置到底有没有生效时可以借助启动期属性日志。相关参数同样见 Configuration 文档参数说明默认值druid.startup.logging.logProperties启动时打印全部属性来自common.runtime.properties、runtime.properties与 JVM 命令行falsedruid.startup.logging.maskProperties对包含这些关键词的属性做脱敏处理如password[password]注意若同时开启这两项仍可能有部分敏感信息被记录到日志生产环境请谨慎评估。小结围绕 Druid 的日志本文覆盖了四个层次的配置能力进程日志通过log4j2.xml定制 Appender、PatternLayout 与 Root 级别并将配置目录置于 classpath 前缀、JUL 桥接-Djava.util.logging.manager、指标日志druid.emitter/druid.emitter.logging.logLevel由LogEmitterModule装配、以及请求日志druid.request.logging.type的五种模式与 MDC 字段由QueryableModule装配、LoggingRequestLogger实现。实际运维中建议将log4j2.xml统一放在各节点_common/目录并保持一份配置多节点复用同时按环境开发/生产区分druid.emitter.logging.logLevel与请求日志开关避免生产环境因过度日志引入性能开销。赞分享数据库数据分析OLAP大数据实时分析数据仓库后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid7/druid点击查看免费下载相关推荐Apache Druid日志配置完全指南Log4j集成与日志级别管理Apache Druid日志配置完全指南Log4j集成与日志级别管理 日志系统基础架构 Apache Druid使用Log4j 2.x作为日志框架所有节点默数据库数据分析OLAP大数据实时分析数据仓库后端Apache Druid日志配置Log4j2与SLF4J集成指南Apache Druid日志配置Log4j2与SLF4J集成指南 Apache Druid服务会生成日志以帮助您进行调试。这些服务还会定期生成关于其状态的 指数据库OLAP大数据后端Apache Druid 请求日志Request Logging配置与实战指南从指标采集到慢查询分析Apache Druid 请求日志Request Logging配置与实战指南从指标采集到慢查询分析 Apache Druid 中所有能够对外提供查询服务数据库OLAP大数据后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考