Log4j2配置:如何将特定异常记录到单独日志文件?
解决方案:Log4j2 定向记录特定Camel异常到独立日志文件
针对你需要将Camel JMS-131这类特定异常单独写入excp.log的需求,以下是可直接落地的Log4j2配置方案,解决你之前只能排除无法单独记录的问题:
核心配置思路
通过路由追加器(RoutingAppender)+ 精准过滤实现:
- 匹配包含目标异常标识(如
JMS-131)的日志,定向输出到excp.log - 可选择是否在常规
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>
关键配置说明
- RegexFilter 作用
ExcpLog中的Filter确保只有匹配JMS-131的日志被写入AppLog中的Filter可选,用于排除该异常(如果不需要在常规日志中保留)
- RoutingAppender 优势
相比单纯的Filter,脚本判断能覆盖异常消息和堆栈信息两种场景,避免因异常标识在堆栈中而无法匹配的问题 - 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
相关产品推荐
相关产品推荐

