You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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&amp;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&amp;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:40:26