如何在Apache Camel XML DSL中为每个路由配置独立目录日志
在Apache Camel XML DSL中实现路由专属目录日志(保留原有日志)
核心实现逻辑
要实现每个路由日志写入独立目录,同时保留原有全局日志,需结合Camel的MDC支持和日志框架(如Logback)的动态配置:
- 利用Camel的
setMDC处理器将当前路由ID注入MDC(映射诊断上下文) - 在日志框架中配置动态appender,根据MDC中的
routeId参数生成独立的日志目录和文件 - 保留原有root logger配置,确保全局日志不受影响
第一步:日志框架配置(以Logback为例)
在logback.xml中添加专属appender,同时保留原有root logger的输出:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 原有全局日志appender(保留不变) --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 路由专属日志appender:按路由ID生成目录 --> <appender name="ROUTE_SPECIFIC_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 动态路径:日志会写入logs/{routeId}/route.log --> <file>logs/${mdc:routeId:-unknown}/route.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>logs/${mdc:routeId:-unknown}/route.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 自定义logger:捕获Camel路由日志,同时输出到专属appender和全局appender --> <logger name="com.mycompany.camel.routes" level="INFO" additivity="false"> <appender-ref ref="ROUTE_SPECIFIC_FILE"/> <appender-ref ref="CONSOLE"/> <!-- 如果需要同时输出到全局控制台,可保留 --> </logger> <!-- 原有root logger配置(保留不变) --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <!-- 原有文件appender也保留 --> </root> </configuration>
第二步:Camel XML DSL路由配置示例
示例1:用户数据同步路由
该路由处理用户数据同步,日志会写入logs/user-sync-route/目录:
<route id="user-sync-route"> <!-- 将路由ID注入MDC,供Logback识别 --> <setMDC key="routeId"> <constant>user-sync-route</constant> </setMDC> <from uri="kafka:user-topic?groupId=user-sync-group"/> <log logger="com.mycompany.camel.routes.user" level="INFO" message="Received user data: ${body}"/> <!-- 业务处理逻辑 --> <to uri="jdbc:userDb?sql=INSERT INTO users(id, name) VALUES(:?id, :?name)"/> <log logger="com.mycompany.camel.routes.user" level="INFO" message="User data saved successfully: ${body}"/> </route>
示例2:订单处理路由
该路由处理订单流程,日志会写入logs/order-processing-route/目录:
<route id="order-processing-route"> <setMDC key="routeId"> <constant>order-processing-route</constant> </setMDC> <from uri="activemq:queue:orders"/> <log logger="com.mycompany.camel.routes.order" level="INFO" message="Processing order: ${body.orderId}"/> <!-- 订单校验、库存扣减等业务逻辑 --> <to uri="bean:orderValidator?method=validate"/> <to uri="bean:inventoryService?method=deduceStock"/> <log logger="com.mycompany.camel.routes.order" level="INFO" message="Order ${body.orderId} processed successfully"/> </route>
示例3:文件备份路由
该路由定时备份指定目录文件,日志会写入logs/file-backup-route/目录:
<route id="file-backup-route"> <setMDC key="routeId"> <constant>file-backup-route</constant> </setMDC> <from uri="file:/source/directory?delay=3600000&noop=true"/> <log logger="com.mycompany.camel.routes.file" level="INFO" message="Starting backup for file: ${file:name}"/> <!-- 文件压缩、备份到目标目录 --> <to uri="file:/backup/directory?fileName=${file:name}.gz&compression=true"/> <log logger="com.mycompany.camel.routes.file" level="INFO" message="File ${file:name} backed up successfully"/> </route>
关键注意事项
- MDC的生命周期:Camel会在路由结束后自动清理MDC中的值,无需手动清除
- additivity设置:在Logback的logger配置中设置
additivity="false",避免日志重复输出到root logger - 路由ID一致性:
setMDC中的值必须和路由的id属性一致,确保目录生成准确 - 日志级别控制:可针对不同路由的logger单独设置级别(如给订单路由设置DEBUG级别)
内容的提问来源于stack exchange,提问作者MykolaKuzmenko
相关产品推荐
相关产品推荐

