• logback日志详细解析


    1、为什么使用logback

    • 内核重写、测试充分、初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升
    • logback非常自然地直接实现了slf4j,方便理解
    • 支持自动去除旧的日志文件,可以控制已经产生日志文件的最大数量
    • 官方自动配置了许多的appender,方便使用

    2、springboot中为什么使用logback-spring.xml来代替logback.xml

    logback.xml的加载早于application.properties,所以如果在logback.xml中使用了变量,而恰好这个变量是写在application.properties时,那么就会获取不到,只要改成logback-spring.xml就可以解决。

    3、属性

    (1)configuration

    configuration是logback的父节点,它只有三个属性:

    • scan

       自动加载判断,当配置文件发生改变时,将会被重新加载。默认为true

    • scanPeriod

          检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒,当scan=true时这个值生效,默认时间间隔为1分钟

    • debug

        当被设置为true时,将打印出logback内部日志信息,实时查看logback运行信息,默认为false

    (2)logger

    <logger>用来设置某一个包或者某一个具体类的日志打印级别以及方式。在logger内可以包含零个或者多个appender-ref,然后对应的appender将会被添加到这个logger。它的属性有:

    • name

       指定对应的包路径或者类路径。

    • level

       用来设置日志打印的级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别

    • additivity

       是否向上级log传递打印信息,默认为true

    (3)root

    <root>也是logger元素,但它是根logger,所有logger的最上级,只有一个level属性,它的name固定为ROOT

    (4)appender

    <appender>是configuration的子节点,它的作用是定义日志输出的方式。它有2个必要的属性:

    • name:指定当前appender的名称
    • class:指定appender对应的类,控制日志输出方式

    (5)encoder

    encoder主要负责的是将日志信息转换成字节数组以及将字节数组写到输出流中去。encoder

    转换符作用
    c {length } 
    lo {length } 
    logger {length } 

    输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。

    Conversion specifierLogger nameResult
    %logger mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
    %logger{0} mainPackage.sub.sample.Bar Bar
    %logger{5} mainPackage.sub.sample.Bar m.s.s.Bar
    %logger{10} mainPackage.sub.sample.Bar m.s.s.Bar
    %logger{15} mainPackage.sub.sample.Bar m.s.sample.Bar
    %logger{16} mainPackage.sub.sample.Bar m.sub.sample.Bar
    %logger{26} mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
    C {length } 
    class {length } 
    输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。
    contextName 
    cn 
    输出上下文名称。
    d {pattern } 
    date {pattern } 
    输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。
    Conversion PatternResult
    %d 2006-10-20 14:06:49,812
    %date 2006-10-20 14:06:49,812
    %date{ISO8601} 2006-10-20 14:06:49,812
    %date{HH:mm:ss.SSS} 14:06:49.812
    %date{dd MMM yyyy ;HH:mm:ss.SSS} 20 oct. 2006;14:06:49.812
    F / file 输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。
    caller{depth}caller{depth, evaluator-1, ... evaluator-n} 输出生成日志的调用者的位置信息,整数选项表示输出信息深度。

    例如, %caller{2}   输出为:

    0    [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)

    例如, %caller{3}   输出为:

    16   [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
    Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)
    L / line 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。
    m / msg / message

    输出应用程序提供的信息。

    M / method 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。
    n 输出平台先关的分行符“ ”或者“ ”。
    p / le / level 输出日志级别。
    r / relative 输出从程序启动到创建日志记录的时间,单位是毫秒
    t / thread 输出产生日志的线程名。
    replace(p ){r, t}

    p 为日志内容,r 是正则表达式,将p 中符合r 的内容替换为t 。

    例如, "%replace(%msg){‘s‘, ‘‘}"

     (6)filter

    <filter>是appender的子节点,表示对当前给定的日志级别再进行一次过滤。配置方式:

    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>

    4、常用Appender说明

    (1)ConsoleAppender

    作用是将日志输出到控制台。配置方式为:

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    (2)FileAppender

    作用是将日志写入到文件中去。配置方式:

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">  
        <file>存储路径</file>  
        <!--  true表示添加到文件结尾,false表示清空文件   -->
        <append>true</append>  
        <encoder>  
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
        </encoder>  
    </appender>

    (3)RollingFileAppender

    作用是滚动记录文件,先将文件记录到指定文件,当符合某个条件时,再将文件记录到其他的文件中去。配置方式:

    <appender name="ERROR"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/error/spring-error-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
    
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    (4)异步写日志

    通常日志会记录到文件中去,此时写一次就会造成一次磁盘IO,而采取异步写日志方式后,不让此次写日志阻塞线程,造成不必要的性能损耗。配置方式:

    <!-- 异步输出 -->  
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->  
        <discardingThreshold>0</discardingThreshold>  
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->  
        <queueSize>512</queueSize>  
        <!-- 添加附加的appender,最多只能添加一个 -->  
        <appender-ref ref ="ERROR"/>  
    </appender>
  • 相关阅读:
    设计模式之装饰模式
    SpringAOP 失效解决方案、Spring事务失效
    Jmeter测试出现端口占用情况
    ElasticSearch创建动态索引
    Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
    TCP的三次握手与四次挥手笔记
    Java中的阻塞队列
    Jmeter5.1——聚合报告参数分析
    SpringCloud"灰度部署"——动态刷新网关配置
    JVM学习笔记——类加载过程
  • 原文地址:https://www.cnblogs.com/origalom/p/11120423.html
走看看 - 开发者的网上家园