log4j2 配置 如何将业务日志与定时任务的日志打印到不同的日志文件中

如何将不同的业务模块的日志打印到不同的日志文件

   目前部门框架里的log4j2的配置是按服务来划分的。一个服务的日志全部打印到一个日志文件中了,一些定时任务生成的日志和业务日志以及提供的其他系统接口的日志全部混在同一个日志文件中,查找起来比较麻烦。我们可以根据配置把不同业务模块的日志区分开,打印到不同的日志文件中。

案例:如何把定时任务的日志和业务日志区分开

情景一、如果定时任务的日志全部全在一个包下,我们就把这个包下的所有的日志打印在一个文件里就解决了,log4j2.xml配置如下
<Appenders>
    <RollingRandomAccessFile name="file"
                                 fileName="${LOG_HOME}/${LOG_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/${LOG_FILE_NAME}.%d{yyyy-MM-dd-HH}-%i.log.bak"
                                 immediateFlush="false" append="true">
            <ThreadContextMapFilter onMatch="DENY" onMismatch="ACCEPT">
                <KeyValuePair key="ROUTINGKEY" value="timer" />
               ThreadContextMapFilter>
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5p | ${APPLICATION} | ${sys:local-env} | ${sys:local-ip} | trice_id:[%X{trice_id}] | req_ip:[%X{request_ip}] |req_url:[%X{request_url}] | method:[%X{request_method}] | userId:[%X{user_id}] |reserve0:%X{reserve0}|reserve1:%X{reserve1}|reserve2:%X{reserve2}| %t | %l %m%n"/>
            
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="24" />
                <SizeBasedTriggeringPolicy size="100 MB"/>
            Policies>
            
            <DefaultRolloverStrategy max="100"/>
        RollingRandomAccessFile>
Appenders>
<Loggers>

    <AsyncLogger name="com.mzt.product.productsupplychain.timer" additivity="FALSE" level="info">
            <appender-ref ref="file" />
        AsyncLogger>
Loggers>
情景二、如果定时任务存在调用其他的包下类的方法,存在链路调用,我们要把整个链路调用的日志文件全部收集在一个日志文件里,那么我们可以基于路由Route进行配置。

LOG4J2提供了MDC功能可以将特殊的日志单独处理输出到特定的文件中。

第一步:我们可以基于切面编程,将日志包下的所有类在有线程调用之前,放一个标记在线程中;

@Pointcut("execution(public * com.mzt.product.productsupplychain.timer.*.*(..))")
    public void logInfo() {
    }

    @Before(value = "logInfo()")
    public void logJudge() {
        ThreadContext.put("ROUTINGKEY", "timer");
    }
    @After(value = "logInfo()")
    public void afterLogPrint(){
        ThreadContext.clearMap();
    }

第二步:配置log4j2.xml

<Appenders>
 
        <RollingRandomAccessFile name="file"
                                 fileName="${LOG_HOME}/${LOG_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/${LOG_FILE_NAME}.%d{yyyy-MM-dd-HH}-%i.log.bak"
                                 immediateFlush="false" append="true">
             
            <ThreadContextMapFilter onMatch="DENY" onMismatch="ACCEPT">
                <KeyValuePair key="ROUTINGKEY" value="timer" />
            ThreadContextMapFilter>
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5p | ${APPLICATION} | ${sys:local-env} | ${sys:local-ip} | trice_id:[%X{trice_id}] | req_ip:[%X{request_ip}] |req_url:[%X{request_url}] | method:[%X{request_method}] | userId:[%X{user_id}] |reserve0:%X{reserve0}|reserve1:%X{reserve1}|reserve2:%X{reserve2}| %t | %l %m%n"/>
            
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="24" />
                <SizeBasedTriggeringPolicy size="100 MB"/>
            Policies>
            
            <DefaultRolloverStrategy max="100"/>
        RollingRandomAccessFile>
    <Routing name="Routing">
            <Routes pattern="$${ctx:ROUTINGKEY}">
                <Route key="timer">
                   <RollingFile name="file2"
                                 fileName="${LOG_HOME}/${LOG_FILE_NAME}-${ctx:ROUTINGKEY}.log"
                                 filePattern="${LOG_HOME}/${LOG_FILE_NAME}-${ctx:ROUTINGKEY}-%d{MM-dd-yyyy}-%i.log.bak">
                        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p | ${APPLICATION} | %t %c %m%n" />
                        <Policies>
                            <SizeBasedTriggeringPolicy size="50 MB" />
                        Policies>
                        <DefaultRolloverStrategy max="100" />
                    RollingFile>
                Route>
            Routes>
        Routing>
    Appenders>
    <Loggers>
        <asyncRoot level="DEBUG"  includeLocation="true">
            <AppenderRef ref="Routing" />
            <AppenderRef ref="file" />
        asyncRoot>
    Loggers>

这样就可以将定时任务的日志打印到相应的日志文件中了,总日志文件里也不会打印定时任务的日志了。

你可能感兴趣的:(Web,Servlet,log4j2,java,运维,按照业务打印到不同的日志文件)