• 涨姿势:Java 分业务、分级别实现自定义日志打印


    自定义日志级别

    通常的日志框架都有以下几个级别,从低到高TRACE,DEBUG,INFO,WARN,ERROR,FATAL.

     

    默认情况,假如我们定义日志打印级别INFO,它会把大于等于INFO级别的日志信息打印出来.这样各个类别的日志都打印在一起不利于日志查看.

     

    按照业务类型打印日志,我们希望info日志文件里只打印info信息,warn日志文件里只打印warn信息,error日志文件只打印error信息,不同的业务模块的日志打印到单独日志文件.

     

    注:本篇使用的日志框架是log4j.实现日志文件只打印指定日志级别是通过Filters实现的,

     

    如下:

        <!--告警信息打印-->
        <RollingFile name="RollingFileWarnLog" fileName="log/warn.log"
                     filePattern="log/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <!--过滤掉其他level-->
            <Filters>
        <!--默认情况会打印大于等于当前级别的日志,因此,需要把error级别的过滤掉-->
               <ThresholdFilter  level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
    
     <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>

    因此实现按业务类型打印日志也很简单,只需要自定义日志级别,然后把大于等于它级别的日志过滤掉就可以了.

     

    下面是个样例配置

    <?xml version="1.0" encoding="utf-8"?>
    <configuration >
    <properties>
        <!-- 文件输出格式 -->
        <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property>
    </properties>
    
    <!--     先定义所有的appender -->
    <!--appender定义日志的输出位置,格式(即patternLayout),日志等级等-->
    <!--loggers定义哪些类使用哪些appender,并可以设置日志级别-->
    <CustomLevels>
        <!--自定义日志级别:业务1-->
        <CustomLevel name="BU_ONE_INFO" intLevel="490" />
        <!--自定义日志级别:业务2-->  
        <CustomLevel name="BU_TWO_INFO" intLevel="480"/>
    </CustomLevels>
    <appenders>
        <!--这个输出控制台的配置:控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
        <Console name="Console" target="system_out">
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
        </Console>
         <!--告警信息打印-->
        <RollingFile name="RollingFileWarnLog" fileName="log/warn.log"
                     filePattern="log/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <!--过滤掉其他level-->
            <Filters>
                <ThresholdFilter  level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
    
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>
        <!--普通信息打印-->
        <RollingFile name="RollingFileInfoLog" fileName="log/info.log"
                     filePattern="log/$${date:yyyy-MM}/info-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <Filters>
                <ThresholdFilter  level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="100"/>
        </RollingFile
            <!--错误信息打印-->
               <RollingFile name="RollingFileErrorLog" fileName="log/error.log"
                     filePattern="log/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <ThresholdFilter  level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="50"/>
        </RollingFile>
    
        <RollingFile name="RollingFileBuOneLog" fileName="log/buoneinfo.log"
                     filePattern="log/$${date:yyyy-MM}/buoneinfo-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <Filters>
                <ThresholdFilter  level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="BU_TWO_INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="BU_ONE_INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="50"/>
        </RollingFile>
    
        <RollingFile name="RollingFileBuTwoLog" fileName="log/butwoinfo.log"
                     filePattern="log/$${date:yyyy-MM}/butwoinfo-%d{yyyy-MM-dd-HH}-%i.log.gz">
            <Filters>
                <ThresholdFilter  level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="BU_TWO_INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="8" modulate="true"/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="50"/>
        </RollingFile>
    
    </appenders>
    
    <!--     然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
    
        <root level="debug">
            <!--<appender-ref ref="connectionFactoryForLog" />-->
            <appender-ref ref="RollingFileInfoLog" />
            <appender-ref ref="RollingFileWarnLog"  />
            <appender-ref ref="RollingFileErrorLog" />
            <appender-ref ref="RollingFileBuTwoLog" />
            <appender-ref ref="RollingFileBuOneLog"  />
            <!--<appender-ref ref="RollingFileTcpPackageLog" />-->
            <appender-ref ref="Console" />
        </root>
    </loggers>
    
    </configuration>

    以上就是配置文件

     

    代码实现如下:

    /**
    * Desc: 自定义日志级别打印,测试类
    * @author l2h
    */
      @RestController
      public class LogController {
    private final Logger logger =  LogManager.getLogger(LogController.class);
    private final Level BU_TWO_INFO = Level.forName("BU_TWO_INFO",480);
    private final Level BU_ONE_INFO = Level.forName("BU_ONE_INFO",490);
    @GetMapping("/log")
    public String log(@RequestParam("msg")String msg){
        logger.log(BU_ONE_INFO,msg);
        logger.log(BU_TWO_INFO,msg);
        logger.info(msg);
        logger.error(msg);
        logger.warn(msg);
        return "success";
    }
      }

    调试结果如下:

    image

    注意

    maven 引入的log4j stater与springboot 框架因为的有冲突,因此需要把springboot exclusion掉,否则会发现没有打印到日志文件中.

    样例代码的maven配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>simos</groupId>
    <artifactId>springboot-quick-start</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>
    </project>

    以上配置实现分业务,分级别自定义日志打印.

    talk is easy , show me the code.

  • 相关阅读:
    Object.Instantiate 实例
    .idata数据的解析
    数据结构-静态链表
    数据结构-循环链表
    Android---两个视图间的淡入淡出
    HDU 4597 Play Game 2013 ACM-ICPC吉林通化全国邀请赛H题
    Android 编译时出现r cannot be resolved to a variable
    找工作笔试面试那些事儿(5)---构造函数、析构函数和赋值函数
    SFINAE 模板替换失败而非报错的应用
    模板实参推导 & xx_cast的实现
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/9141737.html
Copyright © 2020-2023  润新知