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

Log4j2配置:如何将特定异常记录到单独日志文件?

解决方案:Log4j2 定向记录特定Camel异常到独立日志文件

针对你需要将Camel JMS-131这类特定异常单独写入excp.log的需求,以下是可直接落地的Log4j2配置方案,解决你之前只能排除无法单独记录的问题:

核心配置思路

通过路由追加器(RoutingAppender)+ 精准过滤实现:

  1. 匹配包含目标异常标识(如JMS-131)的日志,定向输出到excp.log
  2. 可选择是否在常规app.log中保留该异常日志

完整Log4j2配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!-- 常规运行日志:app.log -->
        <RollingFile name="AppLog" fileName="${sys:catalina.base}/logs/app.log"
                     filePattern="${sys:catalina.base}/logs/app-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c{1.} - %msg%n"/>
            <!-- 可选:从app.log中排除JMS-131异常,需要则保留,不需要则删除此节点 -->
            <RegexFilter regex="JMS-131" onMatch="DENY" onMismatch="ACCEPT"/>
        </RollingFile>

        <!-- 特定异常日志:excp.log -->
        <RollingFile name="ExcpLog" fileName="${sys:catalina.base}/logs/excp.log"
                     filePattern="${sys:catalina.base}/logs/excp-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c{1.} - %msg%n%ex{full}"/>
            <!-- 仅接受包含JMS-131的日志 -->
            <RegexFilter regex="JMS-131" onMatch="ACCEPT" onMismatch="DENY"/>
        </RollingFile>

        <!-- 路由追加器:根据日志内容分发到对应文件 -->
        <Routing name="RoutingAppender">
            <Routes>
                <Route>
                    <!-- 脚本判断:消息或异常堆栈中包含JMS-131则路由到ExcpLog,否则到AppLog -->
                    <ScriptFilter script="
                        var msg = message.getFormattedMessage();
                        var throwable = message.getThrowable();
                        if (msg.contains('JMS-131') || (throwable != null && throwable.toString().contains('JMS-131'))) {
                            return 'EXCP';
                        } else {
                            return 'APP';
                        }
                    "/>
                    <AppenderRef ref="ExcpLog" key="EXCP"/>
                    <AppenderRef ref="AppLog" key="APP"/>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <!-- 根日志绑定路由追加器 -->
        <Root level="INFO">
            <AppenderRef ref="RoutingAppender"/>
        </Root>

        <!-- 可选:针对Camel JMS组件做精准日志配置(推荐) -->
        <Logger name="org.apache.camel.component.jms" level="ERROR" additivity="false">
            <AppenderRef ref="ExcpLog"/>
            <!-- 可选:保留在app.log中则添加此节点,否则删除 -->
            <AppenderRef ref="AppLog"/>
        </Logger>
    </Loggers>
</Configuration>

关键配置说明

  1. RegexFilter 作用
    • ExcpLog中的Filter确保只有匹配JMS-131的日志被写入
    • AppLog中的Filter可选,用于排除该异常(如果不需要在常规日志中保留)
  2. RoutingAppender 优势
    相比单纯的Filter,脚本判断能覆盖异常消息和堆栈信息两种场景,避免因异常标识在堆栈中而无法匹配的问题
  3. Camel组件级Logger
    直接针对org.apache.camel.component.jms配置ERROR日志,比全局匹配更精准,减少不必要的日志扫描

进阶优化:Camel路由标记异常

如果希望更精准地捕获目标异常,可在Camel路由中添加标记,再通过Log4j2的MarkerFilter过滤:

// Camel路由代码中
onException(JmsMessageRedeliveryException.class)
    .markAsHandled()
    .log(LoggingMarker.getMarker("JMS_EXCEPTION"), "JMS异常触发: ${exception.message}");

然后在Log4j2的ExcpLog中替换RegexFilter为:

<MarkerFilter marker="JMS_EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>

注意事项

  • 确保Tomcat环境中Log4j2依赖正确,排除冲突的日志组件(如commons-logging),使用log4j-jcl桥接
  • 测试时触发JMS-131异常,验证excp.log是否生成对应记录,app.log行为符合预期

内容的提问来源于stack exchange,提问作者Display

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:34:53