• 统一日志处理


    一、本文主要讲解Logback日志

    1.1、为什么记录日志? 

    通过日志查看程序的运行过程,运行信息,异常信息等

    1.2、日志级别

    日志记录器(Logger)的行为是分等级的。如下表所示:
    分为:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
    默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别
    最常见简单的写法(自己跑demo用):在appliaction.yml文件中加入
    # 设置日志级别,ERROR级别以及以上级别的日志输出到控制台上,其他级别将不会输出
    logging:
      level:
        root: ERROR

    1.3、创建日志文件

    spring boot内部使用Logback作为日志实现的框架。

    项目中的resources 中创建 logback-spring.xml (默认日志文件的名字),删除appliaction.yml中刚才设置的日志

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
    </configuration>

    1.4、创建测试日志输出,比如在Controller中输出

    @ApiOperation("积分等级列表")
    @GetMapping("/list")
    public R listAll(){
    
        log.info("hi i'm helen");
        log.warn("warning!!!");
        log.error("it's a error");
    
        List<IntegralGrade> list = integrationService.list();
        return R.ok().data("list", list);
    }

    二、基本说明

    2.1、日志配置根节点:configuration

    <configuration></configuration>

    2.2、contextName

    <contextName>是<configuration>的子节点。每个logger都关联到logger上下文,默认上下文名称为“default”。可使用<contextName>设置成其他名字,用于区分不同的应用程序。

    <contextName>myProject</contextName>

    2.3 property

    <property>是<configuration>的子节点,用来定义变量。
    <property> 有两个属性,name和value:name的值是变量的名称,value是变量的值。
    通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量
    <!-- 日志的输出目录 -->
    <property name="log.path" value="D:/project/srb/service_core" />
    
    <!--控制台日志格式:彩色日志-->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
    
    <!--文件日志格式-->
    <property name="FILE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
    
    <!--编码-->
    <property name="ENCODING"
              value="UTF-8" />

    2.4 appender

    <appender>是<configuration>的子节点,是负责写日志的组件
    <appender>有两个必要属性name和class:name指定appender名称,class指定appender的全限定名
    <encoder>对日志进行格式化
    <pattern>定义日志的具体输出格式
    <charset>编码方式
    2.4.1 控制台配置
    <file>表示日志文件的位置,如果上级目录不存在会自动创建,没有默认值。
    <append>默认 true,日志被追加到文件结尾,如果是 false,服务重启后清空现存文件
    <!-- 控制台日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
    </appender>

    2.4.2 文件日志配置

    <file>表示日志文件的位置,如果上级目录不存在会自动创建,没有默认值。
    <append>默认 true,日志被追加到文件结尾,如果是 false,服务重启后清空现存文件。
    <!-- 文件日志 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${log.path}/log.log</file>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
    </appender>

    2.5 logger

    <logger>可以是<configuration>的子节点,用来设置某一个包或具体某一个类的日志打印级别、指定<appender>
    name:用来指定受此logger约束的某一个包或者具体的某一个类
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF。默认继承上级的级别
    <logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
    <!-- 日志记录器  实际使用需要根据不同环境进行设置-->
    <logger name="com.better" level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </logger>

    根据多环境配置 springProfile

    在一个基于Spring boot开发的项目里,常常需要有多套环境的配置:开发,测试以及产品。使用springProfile 可以分别配置开发(dev),测试(test)以及生产(prod)等不同的环境

    <!-- 开发环境和测试环境 -->
    <springProfile name="dev,test">
        <logger name="com.better" level="INFO">
            <appender-ref ref="CONSOLE" />
        </logger>
    </springProfile>
    
    <!-- 生产环境 -->
    <springProfile name="prod">
        <logger name="com.
    better
    " level="ERROR"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </logger> </springProfile>

    四、滚动日志

    出现问题:生产环境下,如果系统长时间运行,那么日志文件会变得越来越大,系统读取和写入日志的时间会越来越慢,严重的情况会耗尽系统内存,导致系统宕机。
    解决方案:可以设置滚动日志。
    4.1 设置时间滚动策略
    RollingFileAppender是Appender的另一个实现,表示滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将旧日志备份到其他文件
    <rollingPolicy>是<appender>的子节点,用来定义滚动策略。
    TimeBasedRollingPolicy:最常用的滚动策略,根据时间来制定滚动策略。
    <fileNamePattern>:包含文件名及转换符, “%d”可以包含指定的时间格式,如:%d{yyyy-MM-dd}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
    <maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
        <!--  要区别于其他的appender中的文件名字  -->
        <file>${log.path}/log-rolling.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
    
    
        <!-- 设置滚动日志记录的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--归档日志文件保留的最大数量-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    
    </appender>

    4.2 设置触发滚动时机

    放在<rollingPolicy>的子节点的位置,基于实践策略的触发滚动策略
    <maxFileSize>设置触发滚动条件:单个文件大于100M时生成新的文件
    注意:修改日志文件名 此时 <fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>100M</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>

    五、综上,列出完整日志文件logback-spring.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <configuration >
     3     <contextName>atguiguSrb</contextName>
     4 
     5     <property name="log.path" value="D:/project/srb/service_core"/>
     6 
     7     <!--控制台日志格式:彩色日志-->
     8     <!-- magenta:洋红 -->
     9     <!-- boldMagenta:粗红-->
    10     <!-- cyan:青色 -->
    11     <!-- white:白色 -->
    12     <!-- magenta:洋红 -->
    13     <property name="CONSOLE_LOG_PATTERN"
    14               value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
    15 
    16     <!--文件日志格式-->
    17     <property name="FILE_LOG_PATTERN"
    18               value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
    19 
    20     <!--编码-->
    21     <property name="ENCODING"
    22               value="UTF-8" />
    23 
    24     <!-- 控制台日志 -->
    25     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    26         <encoder>
    27             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    28             <charset>${ENCODING}</charset>
    29         </encoder>
    30     </appender>
    31 
    32     <!-- 文件日志 -->
    33     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    34         <file>${log.path}/log.log</file>
    35         <append>true</append>
    36         <encoder>
    37             <pattern>${FILE_LOG_PATTERN}</pattern>
    38             <charset>${ENCODING}</charset>
    39         </encoder>
    40     </appender>
    41 
    42     <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    43 
    44         <!--  要区别于其他的appender中的文件名字  -->
    45         <file>${log.path}/log-rolling.log</file>
    46         <encoder>
    47             <pattern>${FILE_LOG_PATTERN}</pattern>
    48             <charset>${ENCODING}</charset>
    49         </encoder>
    50 
    51 
    52         <!-- 设置滚动日志记录的滚动策略 -->
    53         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    54             <!-- 日志归档路径以及格式 -->
    55             <fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    56             <!--归档日志文件保留的最大数量,次数代表天数-->
    57             <maxHistory>15</maxHistory>
    58 
    59             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    60                 <maxFileSize>100MB</maxFileSize>
    61             </timeBasedFileNamingAndTriggeringPolicy>
    62         </rollingPolicy>
    63 
    64     </appender>
    65 
    66 
    67 <!--        <logger name="com.atguigu" level="INFO">-->
    68 <!--            <appender-ref ref="CONSOLE" />-->
    69 <!--            <appender-ref ref="FILE" />-->
    70 <!--        </logger>-->
    71 
    72     <!-- 开发环境和测试环境 -->
    73     <springProfile name="dev,test">
    74         <logger name="com.atguigu" level="INFO">
    75             <appender-ref ref="CONSOLE" />
    76         </logger>
    77     </springProfile>
    78 
    79     <!-- 生产环境 -->
    80     <springProfile name="prod">
    81         <logger name="com.atguigu" level="ERROR">
    82             <appender-ref ref="CONSOLE" />
    83             <appender-ref ref="ROLLING_FILE" />
    84         </logger>
    85     </springProfile>
    86 </configuration>
     
  • 相关阅读:
    程序员书单_移动开发篇
    程序员书单_程序人生篇
    程序员书单_软考篇
    程序员书单_云计算篇
    程序员书单_数据库篇
    程序员书单_sshi框架篇
    程序员书单_软件工程篇
    程序员书单_项目管理篇
    Informatica在linux下安装搭建
    Informatica9.5.1创建资源库出错找不到libpmora8.so
  • 原文地址:https://www.cnblogs.com/gzhcsu/p/15950971.html
Copyright © 2020-2023  润新知