log4j2如何输出异常信息到日志文件中?

问题描述

原项目使用log4j管理日志,现在升级为log4j2后无法自动输出异常信息到日志文件内。

问题出现的环境背景及自己尝试过哪些方法

现在可以手动捕获异常然后通过logger.error("", e);打印异常信息到控制台和日志文件,但是项目太大全部修改花费时间太多了,想实现像log4j一样自动捕获后输出到日志文件内。

相关代码

log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- log4j2 配置文件 -->
<!-- 日志级别 trace<debug<info<warn<error<fatal -->
<configuration status="debug">
    <!-- 自定义属性 -->
    <Properties>
        <!-- 日志格式 -->
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} (%F:%L) %5p %m%n</Property>
        <!-- 日志文件路径 -->
        <Property name="filePath">D:/Tomcat 6.0/log4j/equipmentLease/</Property>
        <!-- debug级别日志文件名称 -->
        <Property name="debugFileName">${filePath}/debug.log</Property>
        <!-- info级别日志文件名称 -->
        <Property name="infoFileName">${filePath}/info.log</Property>
        <!-- error级别日志文件名称 -->
        <Property name="errorFileName">${filePath}/error.log</Property>
    </Properties>
    
    <!-- 定义输出器 -->
    <appenders>
        <!-- 控制台输出 -->
        <Console name="console" target="SYSTEM_OUT">
            <!-- 日志格式 -->
            <PatternLayout pattern="${pattern}"/>
        </Console>
        
        <!-- debug级别日志文件输出 -->
        <RollingFile name="debug_appender" fileName="${debugFileName}"
                filePattern="${filePath}/%d{yyyy-MM-dd}/debug_%i.log">
            <!-- 过滤器 -->
            <Filters>
                <!-- 限制日志级别在debug及以上在info以下 -->
                <ThresholdFilter level="debug"/>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!-- 日志格式 -->
            <PatternLayout pattern="${pattern}"/>
            <!-- 策略 -->
            <Policies>
                <!-- 每隔一天转存 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件大小 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        
        <!-- info级别日志文件输出 -->
        <RollingFile name="info_appender" fileName="${infoFileName}"
                filePattern="${filePath}/%d{yyyy-MM-dd}/info_%i.log">
            <!-- 过滤器 -->
            <Filters>
                <!-- 限制日志级别在info及以上在error以下 -->
                <ThresholdFilter level="info"/>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!-- 日志格式 -->
            <PatternLayout pattern="${pattern}"/>
            <!-- 策略 -->
            <Policies>
                <!-- 每隔一天转存 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件大小 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        
        <!-- error级别日志文件输出 -->
        <RollingFile name="error_appender" fileName="${errorFileName}"
                filePattern="${filePath}/%d{yyyy-MM-dd}/error_%i.log">
            <!-- 过滤器 -->
            <Filters>
                <!-- 限制日志级别在error及以上 -->
                <ThresholdFilter level="error"/>
            </Filters>
            <!-- 日志格式 -->
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <!-- 每隔一天转存 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件大小 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    
    <!-- 定义logger -->
    <loggers>
        
        <!-- 定义根logger -->
        <!-- 日志级别设备为debug 具体日志级别由appender限制 -->
        <Root level="debug">
            <!-- 输出控制台 -->
            <AppenderRef ref="console"/>
            <!-- 输出debug级别日志文件 -->
            <AppenderRef ref="debug_appender"/>
            <!-- 输出info级别日志文件 -->
            <AppenderRef ref="info_appender"/>
            <!-- 输出error级别日志文件 -->
            <AppenderRef ref="error_appender"/>
        </Root>
    </loggers>
</configuration>
阅读 11k
1 个回答

居然被邀请了。
只不过这个问题不是很懂额。难道还有不调用log方法就能打日志的方法吗?Log4j还有自动捕获异常功能吗,可否贴个文档地址看一下(真心求教)。

你的需求我目前能想到的就是,就是通过Spring AOP的方式实现,在afterThrowing()方法中,将异常捕获打印,并将切面的作用域加入到我们想要处理的包或类中,问题就解决了,当然只处理作用域未处理的异常,作用域处理的异常还需要你手动添加log.info打印。

也不知道有没有答到点子上。。。

 @AfterThrowing(value = "", throwing = "e")
    public void afterThrowing(Throwable e) {
       
       logger.error("发现未知异常", e);
        
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题