美文网首页
自定义日志打印

自定义日志打印

作者: simoscode | 来源:发表于2018-04-17 20:25 被阅读22次

1前言

打好日志关爱你我他!开发过程,关键信息打印,有助于上线后,通过日志查看了解系统运行情况,同时有助于定位线上问题.

2自定义日志级别,按照业务类型打印日志

通常的日志框架,日志都有以下几个级别,从低到高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>

以上就是,配置文件了,代码里实现如下:

/**
* Created by l2h on 18-4-17.
* 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.png
image.png
注意 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>

通过以上配置就可以实现按业务打印,按级别打印日志文件了.log4j具体的配置可以查看官方文档.样例代码的源码.

相关文章

  • iOS - Description

    自定义 po 打印,print & NSLog 类的打印输出 description - print 日志输出 d...

  • kong 自定义插件开发

    1、安装插件 2、kong重新加载插件 3、查看Kong的日志 4、自定义日志打印,并且采集到ELK 5、日志输出...

  • grep+sed+awk简单实战,日志分析示例

    问题场景 测试Burrow的评估功能,加了自定义打印的日志,然后每一条自己打印的日志格式是这样的 原本就是一行,为...

  • Flutter Plugin 的编写使用

    Flutter Plugin 资料 [TOC] 前言 在Flutter中,如果我们需要打印日志,如果不进行自定义,...

  • Retrofit接口调用

    功能特性 [x] 自定义注入OkHttpClient[x] 注解式拦截器[x] 连接池管理[x] 日志打印...

  • 自定义日志打印

    1前言 打好日志关爱你我他!开发过程,关键信息打印,有助于上线后,通过日志查看了解系统运行情况,同时有助于定位线上...

  • swift基础1 -- 输出

    自定义打印可参考swift自定义打印

  • Java自定义注解原理及实现

    本章主要内容:1.了解注解原理,2,自定义注解(根据实际应用自定义注解打印每个接口的请求日志) 一, 了解注解原理...

  • 记录: 日志框架改造落地的一次问题

    现象: win正常打印日志mac不能打印日志,linux某些机器可以打印,换到其他服务器不能打印. 分析: 日志冲...

  • 对wrap_content的深入理解

    以LinearLayout为例,子View是一个自定义View。这样可以在onMeasure方法重写打印日志便于分...

网友评论

      本文标题:自定义日志打印

      本文链接:https://www.haomeiwen.com/subject/qnxhkftx.html