• springboot之日志配置-logback


    springboot之日志配置-logback

    1、为什么使用logback

    • logback是springboot默认集成的,是基于Sl4J的日志框架。
    • logback的内核重写了,使得在某些关键路径上执行时大约会节省大约10倍的速度,同时占用更少的内存。
    • logback提供了更加详细并且不断更新的文档。
    • logback支持自动从I / O故障中恢复正常。如果文件服务器暂时失败,可以不用重新启动应用程序让日志记录再次运行,一旦文件服务器恢复,相关的logback appender将从之前的错误状态自动的快速恢复。

    2、logback在springboot项目中的简单使用

    logback是springboot项目中的默认集成的日志框架,在默认的配置环境下,该日志框架只会输出INFO级别以上的日志信息到控制台中,如果需要将日志文件输出到具体的文件中,可以在application.properties或者application.yml文件中添加日志文件的输出路径和名称。

    //设置日志文件,可以是绝对路径,也可以是相对路径
    logging.file=xxx.log
    //设置日志文件保存目录,会在该目录下创建spring.log文件,并写入日志内容
    logging.path=/logs
    //注:二者不能同时使用,若同时使用,则只有logging.file生效
    

    3、自定义logback的配置文件,适应项目中对日志的不同需求

    在springboot项目中,项目会自动扫描类路径(即classpath:)下的logback.xml和logback-spring.xml(spring官方推荐的配置文件名称)文件,如果没有找到,则使用spring默认的logback的配置文件。
    所以,在自定义logback的配置时,优先在logback.xml和logback-spring.xml文件中书写。如果是其他格式,也一定要以logback-为文件前缀,最后在application.properties中使用logging.config=来指定日志配置文件位置。

    logging.config=classpath:logging-xxx.xml
    

    4、书写配置文件前需要清楚的几个知识点

    • 根节点:文件中的所有内容都将包含在此根节点中,该节点包含下面三个属性
      • scan:默认值为true,当此属性值设置为true时,配置文件如果发生改变,将会被重新加载
      • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认的时间单位是毫秒。当scan为true时,此属性生效。默认的间隔时间是一分钟。
      • debug:默认值为false,当此属性设置为true时,将打印出logback的内部日志,可以实时查看logback的运行状态。
    <configuration scan="true" scanPeriod="60 seconds" debug="false"> 
        ...... 
    </configuration>
    
    • 子节点:用来设置上下文的名称,默认的上下文名称为default,但可以使用设置成其他的名字,用于区分不同应用程序的记录。
    <configuration scan="true" scanPeriod="60 seconds" debug="false"> 
        <contextName>dimples-logback</contextName> 
        ......
    </configuration>
    
    • 子节点:用来定义一个变量,其中有两个属性name和value,在logger文件中可以通过${}来取出name对应的property中的value的值。
    • 子节点:配置日志的具体功能和内容的节点,有name和class属性,通过class来指定日志的处理类型。常用的以下二种
    ch.qos.logback.core.ConsoleAppender:日志输出到控制台
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 设置日志输出格式 -->
            <Pattern>${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    ch.qos.logback.core.rolling.RollingFileAppender:滚动记录文件
    
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 正在记录的日志文件的路径及文件名 -->
       <file>C:/springboot-log/logs/info/log_info.log</file>
       <!--日志信息输出格式-->
       <encoder>
           <!-- 设置日志输出格式 -->
          <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
          <!-- 日志输出的编码 -->
          <charset>UTF-8</charset>
       </encoder>
       <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- 每天日志归档路径以及格式 -->
          <fileNamePattern>C:/springboot-log/logs/info/log-info-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
          <timeBasedFileNamingAndTriggeringPolicy
             class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
             <!--单个日志文件的最大大小-->
             <maxFileSize>100MB</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
          <!--日志文件保留天数-->
          <maxHistory>15</maxHistory>
       </rollingPolicy>
       <!-- 设置日志文件记录的级别,如只记录info级别 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>info</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
       </filter>
    </appender>
    
    • 除以上两种日志处理类型以外,还有其他如
      1、FileAppender:普通的将日志添加到文件中
      2、SocketAppender、
      3、SMTPAppender、
      4、DBAppender、
      5、SyslogAppender、
      6、SiftingAppender 等等

    最后贴上个人在平时的项目中总结的logback的配置文件,分为debug、info、warn、error四种类型的日志信息,分别保存到此四个文件夹中,并按大小和日期进行归档。满足大部分的业务场景。

    友情链接(个人学习的项目总结)GitHub地址
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
    
    <!-- 根节点<configuration>,包含下面三个属性:-->
    <!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
    <!-- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
    <!-- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
    <configuration>
       <contextName>dimples-logback</contextName>
       <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
       <property name="log.path" value="C:/springboot-log/logs" />
    
       <!-- 彩色日志 -->
       <!-- 彩色日志依赖的渲染类 -->
       <conversionRule conversionWord="clr"
          converterClass="org.springframework.boot.logging.logback.ColorConverter" />
       <conversionRule conversionWord="wex"
          converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
       <conversionRule conversionWord="wEx"
          converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
       <!-- 彩色日志格式 -->
       <property name="CONSOLE_LOG_PATTERN"
          value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
       <property name="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %msg%n"/>
       <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %msg%n"/>
       <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
       <!-- appender是configuration的子节点,是负责写日志的组件。 -->
       <!-- ConsoleAppender:把日志输出到控制台 -->
       <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
             <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
             <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
             <charset>UTF-8</charset>
          </encoder>
       </appender>
    
       <!-- 时间滚动输出 level为 DEBUG 日志 -->
       <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文件的路径及文件名 -->
          <file>${log.path}debug/log_debug.log</file>
          <!--日志信息输出格式-->
          <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志归档 -->
             <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
             <!--日志文件保留天数-->
             <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文件只记录debug级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>debug</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
       </appender>
    
       <!-- 时间滚动输出 level为 INFO 日志 -->
       <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文件的路径及文件名 -->
          <file>${log.path}info/log_info.log</file>
          <!--日志信息输出格式-->
          <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 每天日志归档路径以及格式 -->
             <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
             <!--日志文件保留天数-->
             <maxHistory>15</maxHistory>
          </rollingPolicy>
          <!-- 此日志文件只记录info级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>info</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
       </appender>
    
       <!-- 时间滚动输出 level为 WARN 日志 -->
       <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文件的路径及文件名 -->
          <file>${log.path}warn/log_warn.log</file>
          <!--日志信息输出格式-->
          <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
             <!--日志文件保留天数-->
             <maxHistory>30</maxHistory>
          </rollingPolicy>
          <!-- 此日志文件只记录warn级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>warn</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
       </appender>
       <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
       <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->
       <!-- 时间滚动输出 level为 ERROR 日志 -->
       <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 正在记录的日志文件的路径及文件名 -->
          <file>${log.path}error/log_error.log</file>
          <!--日志信息输出格式-->
          <encoder>
             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset> <!-- 此处设置字符集 -->
          </encoder>
          <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
             <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
             <!--日志文件保留天数-->
             <maxHistory>30</maxHistory>
          </rollingPolicy>
          <!-- 此日志文件只记录ERROR级别的 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
       </appender>
       <!--开发环境:打印控制台-->
       <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
       <!-- com.dimples.springboot.biz为业务逻辑根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
       <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
       <springProfile name="dev">
          <logger name="com.dimples.springboot.biz" level="debug" />
       </springProfile>
       <!-- 控制台输出日志级别 -->
       <root level="info">
          <appender-ref ref="CONSOLE" />
          <appender-ref ref="DEBUG_FILE" />
          <appender-ref ref="INFO_FILE" />
          <appender-ref ref="WARN_FILE" />
          <appender-ref ref="ERROR_FILE" />
       </root>
    
       <!--生产环境:输出到文件-->
       <!--<springProfile name="pro">-->
       <!--<root level="info">-->
       <!--<appender-ref ref="CONSOLE" />-->
       <!--<appender-ref ref="DEBUG_FILE" />-->
       <!--<appender-ref ref="INFO_FILE" />-->
       <!--<appender-ref ref="ERROR_FILE" />-->
       <!--<appender-ref ref="WARN_FILE" />-->
       <!--</root>-->
       <!--</springProfile>-->
    </configuration>
    
  • 相关阅读:
    VUE2.0项目实现动态修改请求的服务器地址
    el-select和data
    el-tree禁用
    国际化全部整理
    洛谷P2899 Cell Phone Network G 题解
    【nvidia jetson xavier】 Deepstream Yolov3示例模型运行
    【nvidia jetson xavier】 风扇开机自启动
    A Semisupervised CRF Model for CNN-Based Semantic Segmentation With Sparse Ground Truth
    Semi-supervised semantic segmentation needs strong, varied perturbations
    Remote Sensing Images Semantic Segmentation with General Remote Sensing Vision Model via a Self-Supervised Contrastive Learning Method
  • 原文地址:https://www.cnblogs.com/reroyalup/p/13156353.html
Copyright © 2020-2023  润新知