精华内容
下载资源
问答
  • By default the relevant information is output as-is. However, with the aid of format modifiers it is possible to changethe minimum and maximum width and the justifications of each data field.The optio...

    By default the relevant information is output as-is. However, with the aid of format modifiers it is possible to change

    the minimum and maximum width and the justifications of each data field.

    The optional format modifier is placed between the percent sign and the conversion character or word.

    The first optional format modifier is the left justification flag which is just the minus (-) character.

    Then comes the optional minimum field width modifier. This is a decimal constant that represents the minimum number of

    characters to output. If the data item contains fewer characters, it is padded on either the left or the right until

    the minimum width is reached. The default is to pad on the left (right justify) but you can specify right padding with

    the left justification flag. The padding character is space. If the data item is larger than the minimum field width,

    the field is expanded to accommodate the data. The value is never truncated.

    展开全文
  • logback自定义日志配置

    2021-05-28 16:02:03
    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。 也可以使用...

    1. logback-spring.xml详解

    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。

    也可以使用自定义的名称,比如logback-config.xml,只需要在application.properties文件中使用logging.config=classpath:logback-config.xml指定即可。

    在讲解 log’back-spring.xml之前我们先来了解三个单词:Logger, Appenders and Layouts(记录器、附加器、布局):Logback基于三个主要类:Logger,Appender和Layout。 这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。首先给出一个基本的xml配置如下:

    <configuration>
     
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
     
      <logger name="chapters.configuration" level="INFO"/>
     
      <!-- Strictly speaking, the level attribute is not necessary since -->
      <!-- the level of the root level is set to DEBUG by default.       -->
      <root level="DEBUG">          
        <appender-ref ref="STDOUT" />
      </root>  
      
    </configuration>
    

    1.1 元素

    logback.xml配置文件的基本结构可以描述为元素,包含零个或多个元素,后跟零个或多个元素,后跟最多一个元素(也可以没有)。下图说明了这种基本结构:
    在这里插入图片描述

    1.2 元素

    元素只接受一个必需的name属性,一个可选的level属性和一个可选的additivity属性,允许值为true或false。 level属性的值允许一个不区分大小写的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。特殊于大小写不敏感的值INHERITED或其同义词NULL将强制记录器的级别从层次结构中的较高级别继承,元素可以包含零个或多个元素; 这样引用的每个appender都被添加到指定的logger中,(注:additivity属性下面详说),logger元素级别具有继承性。
    例1:示例中,仅为根记录器分配了级别。 此级别值DEBUG由其他记录器X,X.Y和X.Y.Z继承

    Logger nameAssigned levelEffective level
    rootDEBUGDEBUG
    XnoneDEBUG
    X.YnoneDEBUG
    X.Y.ZnoneDEBUG

    例2:所有记录器都有一个指定的级别值。 级别继承不起作用

    Logger nameAssigned levelEffective level
    rootERRORERROR
    XINFOINFO
    X.YDEBUGDEBUG
    X.Y.ZWARNWARN

    例3:记录器root,X和X.Y.Z分别被分配了DEBUG,INFO和ERROR级别。 Logger X.Y从其父X继承其级别值。

    Logger nameAssigned levelEffective level
    rootDEBUGDEBUG
    XINFOINFO
    X.YnoneINFO
    X.Y.ZERRORERROR

    例4:在示例4中,记录器root和X分别被分配了DEBUG和INFO级别。 记录器X.Y和X.Y.Z从其最近的父X继承其级别值,该父级具有指定的级别。

    Logger nameAssigned levelEffective level
    rootDEBUGDEBUG
    XINFOINFO
    X.YnoneINFO
    X.Y.ZnoneINFO

    1.3 元素

    元素配置根记录器。 它支持单个属性,即level属性。 它不允许任何其他属性,因为additivity标志不适用于根记录器。 此外,由于根记录器已被命名为“ROOT”,因此它也不允许使用name属性。 level属性的值可以是不区分大小写的字符串TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一元素可以包含零个或多个元素; 这样引用的每个appender都被添加到根记录器中(注:additivity属性下面详说)。

    1.4 元素

    appender使用元素配置,该元素采用两个必需属性name和class。 name属性指定appender的名称,而class属性指定要实例化的appender类的完全限定名称。 元素可以包含零个或一个元素,零个或多个元素以及零个或多个元素,下图说明了常见的结构:
    在这里插入图片描述

    重要:在logback中,输出目标称为appender,addAppender方法将appender添加到给定的记录器logger。给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender。换句话说,appender是从记录器层次结构中附加地继承的。例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。如果另外将文件追加器添加到记录器(例如L),则对L和L的子项启用的记录请求将打印在文件和控制台上。通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积。

    Appender是一个接口,它有许多子接口和实现类,具体如下图所示:
    在这里插入图片描述
    其中最重要的两个Appender为:ConsoleAppenderRollingFileAppender

    1.4.1:ConsoleAppender

    ConsoleAppender,如名称所示,将日志输出到控制台上。

    1.4.2:RollingFileAppender

    RollingFileAppender,是FileAppender的一个子类,扩展了FileAppender,具有翻转日志文件的功能。 例如,RollingFileAppender 可以记录到名为log.txt文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。

    有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即 RollingPolicy 负责执行翻转所需的操作。RollingFileAppender的第二个子组件,即 TriggeringPolicy将确定是否以及何时发生翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。

    作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。

    1.4.3:滚动策略

    TimeBasedRollingPolicy:可能是最受欢迎的滚动策略。 它根据时间定义翻转策略,例如按天或按月。 TimeBasedRollingPolicy承担滚动和触发所述翻转的责任。 实际上,TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口。

    SizeAndTimeBasedRollingPolicy:有时您可能希望按日期归档文件,但同时限制每个日志文件的大小,特别是如果后处理工具对日志文件施加大小限制。 为了满足此要求,logback 提供了 SizeAndTimeBasedRollingPolicy ,它是TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。

    1.5 元素

    encoder中最重要就是pattern属性,它负责控制输出日志的格式,这里给出一个我自己写的示例:

    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
    

    在这里插入图片描述

    其中:

    • %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
    • %-5level:日志级别
    • %highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色
    • %thread:打印日志的线程
    • %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符
    • %logger:日志输出的类名
    • %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符
    • %cyan:颜色
    • %msg:日志输出内容
    • %n:换行符

    1.6 元素

    filter中最重要的两个过滤器为:LevelFilter、ThresholdFilter。

    LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下面配置将只打印INFO级别的日志,其余的全部禁止打印输出:

    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
    

    ThresholdFilter 过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于INFO级别的日志,只输出INFO以及以上级别的日志:

    <configuration>
      <appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
    

    2. logback.xml详解

    以上介绍了xml中重要的几个元素,下面将我配置的xml贴出来以供参考(实现了基于日期和大小翻滚的策略,以及经INFO和ERROR日志区分输出,还有规范日志输出格式等):

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
     
        <!-- appender是configuration的子节点,是负责写日志的组件。 -->
        <!-- ConsoleAppender:把日志输出到控制台 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
             但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
            <!--<immediateFlush>true</immediateFlush>-->
            <encoder>
                <!-- %37():如果字符没有37个字符长度,则左侧用空格补齐 -->
                <!-- %-37():如果字符没有37个字符长度,则右侧用空格补齐 -->
                <!-- %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 -->
                <!-- %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符 -->
                <!-- %msg:日志打印详情 -->
                <!-- %n:换行符 -->
                <!-- %highlight():转换说明符以粗体红色显示其级别为ERROR的事件,红色为WARN,BLUE为INFO,以及其他级别的默认颜色。 -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
                <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
     
        <!-- info 日志-->
        <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
        <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
        <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
        <appender name="info_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--日志文件路径和名称-->
            <File>logs/project_info.log</File>
            <!--是否追加到文件末尾,默认为true-->
            <append>true</append>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>DENY</onMatch><!-- 如果命中ERROR就禁止这条日志 -->
                <onMismatch>ACCEPT</onMismatch><!-- 如果没有命中就使用这条规则 -->
            </filter>
            <!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
             RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
            作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
                <!-- 文件名:logs/project_info.2017-12-05.0.log -->
                <!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
                <fileNamePattern>logs/project_info.%d.%i.log</fileNamePattern>
                <!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
                如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
                <maxHistory>30</maxHistory>
                <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
                <totalSizeCap>20GB</totalSizeCap>
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
                <maxFileSize>10MB</maxFileSize>
            </rollingPolicy>
            <!--编码器-->
            <encoder>
                <!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
                <!-- 记录日志的编码:此处设置字符集 - -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
     
        <!-- error 日志-->
        <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
        <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_error.log -->
        <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
        <appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--日志文件路径和名称-->
            <File>logs/project_error.log</File>
            <!--是否追加到文件末尾,默认为true-->
            <append>true</append>
            <!-- ThresholdFilter过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件 -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level><!-- 低于ERROR级别的日志(debug,info)将被拒绝,等于或者高于ERROR的级别将相应NEUTRAL -->
            </filter>
            <!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
            RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
           作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
                <!-- 文件名:logs/project_error.2017-12-05.0.log -->
                <!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
                <fileNamePattern>logs/project_error.%d.%i.log</fileNamePattern>
                <!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
                如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
                <maxHistory>30</maxHistory>
                <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
                <totalSizeCap>20GB</totalSizeCap>
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
                <maxFileSize>10MB</maxFileSize>
            </rollingPolicy>
            <!--编码器-->
            <encoder>
                <!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
                <!-- 记录日志的编码:此处设置字符集 - -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
     
        <!--给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender(不用在意level值)。
        换句话说,appender是从记录器层次结构中附加地继承的。
        例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
        如果另外将文件追加器添加到记录器(例如L),则对L和L'子项启用的记录请求将打印在文件和控制台上。
        通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积-->
        <!-- configuration中最多允许一个root,别的logger如果没有设置级别则从父级别root继承 -->
        <root level="INFO">
            <appender-ref ref="STDOUT" />
        </root>
     
        <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
        <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
        <logger name="com.sailing.springbootmybatis" level="INFO">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
     
        <!-- 利用logback输入mybatis的sql日志,
        注意:如果不加 additivity="false" 则此logger会将输出转发到自身以及祖先的logger中,就会出现日志文件中sql重复打印-->
        <logger name="com.sailing.springbootmybatis.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
     
        <!-- additivity=false代表禁止默认累计的行为,即com.atomikos中的日志只会记录到日志文件中,不会输出层次级别更高的任何appender-->
        <logger name="com.atomikos" level="INFO" additivity="false">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
     
    </configuration>
    
    展开全文
  • -- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新...

    为什么使用logback

    1. Logback 是log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J
    2. Logback的定制性更加灵活,同时也是spring boot的内置日志框架

    开始使用
    一:添加依赖:maven依赖中添加了spring-boot-starter-logging

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    但是呢,实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging

    配置

      在配置文件中配置(这一步如果文件名带spring不写也可,如果不带spring必须得写,保险点写上)

     

    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。

    也可以使用自定义的名称,比如logback-config.xml,只需要在application.properties文件中使用logging.config=classpath:logback-config.xml指定即可。
     

     logging:

      config: classpath:logback-spring.xml

    在讲解 log'back-spring.xml之前我们先来了解三个单词:Logger, Appenders and Layouts(记录器、附加器、布局):Logback基于三个主要类:Logger,Appender和Layout。 这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。首先给出一个基本的xml配置如下:

    <configuration>
     
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
     
      <logger name="chapters.configuration" level="INFO"/>
     
      <!-- Strictly speaking, the level attribute is not necessary since -->
      <!-- the level of the root level is set to DEBUG by default.       -->
      <root level="DEBUG">          
        <appender-ref ref="STDOUT" />
      </root>  
      
    </configuration>
    3.1:<configuration>元素

    logback.xml配置文件的基本结构可以描述为<configuration>元素,包含零个或多个<appender>元素,后跟零个或多个<logger>元素,后跟最多一个<root>元素(也可以没有)。下图说明了这种基本结构:

    3.2:<logger>元素

    <logger>元素只接受一个必需的name属性,一个可选的level属性和一个可选的additivity属性,允许值为true或false。 level属性的值允许一个不区分大小写的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。特殊于大小写不敏感的值INHERITED或其同义词NULL将强制记录器的级别从层次结构中的较高级别继承,<logger>元素可以包含零个或多个<appender-ref>元素; 这样引用的每个appender都被添加到指定的logger中,(注:additivity属性下面详说),logger元素级别具有继承性。

    例1:示例中,仅为根记录器分配了级别。 此级别值DEBUG由其他记录器X,X.Y和X.Y.Z继承

    Logger name    Assigned level    Effective level
    root

    DEBUG    DEBUG
    X    none    DEBUG
    X.Y    none    DEBUG
    X.Y.Z    none    DEBUG
    例2:所有记录器都有一个指定的级别值。 级别继承不起作用

    Logger name    Assigned level    Effective level
    root    ERROR    ERROR
    X    INFO    INFO
    X.Y    DEBUG    DEBUG
    X.Y.Z    WARN    WARN
    例3:记录器root,X和X.Y.Z分别被分配了DEBUG,INFO和ERROR级别。 Logger X.Y从其父X继承其级别值。

    Logger name    Assigned level    Effective level
    root    DEBUG    DEBUG
    X    INFO    INFO
    X.Y    none    INFO
    X.Y.Z    ERROR    ERROR
    例4:在示例4中,记录器root和X分别被分配了DEBUG和INFO级别。 记录器X.Y和X.Y.Z从其最近的父X继承其级别值,该父级具有指定的级别。

    Logger name    Assigned level    Effective level
    root    DEBUG    DEBUG
    X    INFO    INFO
    X.Y    none    INFO
    X.Y.Z    none    INFO

    3.3:<root>元素

    <root>元素配置根记录器。 它支持单个属性,即level属性。 它不允许任何其他属性,因为additivity标志不适用于根记录器。 此外,由于根记录器已被命名为“ROOT”,因此它也不允许使用name属性。 level属性的值可以是不区分大小写的字符串TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一<root>元素可以包含零个或多个<appender-ref>元素; 这样引用的每个appender都被添加到根记录器中(注:additivity属性下面详说)。

    3.4:<appender>元素

    appender使用<appender>元素配置,该元素采用两个必需属性name和class。 name属性指定appender的名称,而class属性指定要实例化的appender类的完全限定名称。 <appender>元素可以包含零个或一个<layout>元素,零个或多个<encoder>元素以及零个或多个<filter>元素

    重要:在logback中,输出目标称为appender,addAppender方法将appender添加到给定的记录器logger。给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender。换句话说,appender是从记录器层次结构中附加地继承的。例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。如果另外将文件追加器添加到记录器(例如L),则对L和L的子项启用的记录请求将打印在文件和控制台上。通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积。

    Appender是一个接口,它有许多子接口和实现类

    其中最重要的两个Appender为:ConsoleAppender 、RollingFileAppender。

    3.4.1:ConsoleAppender

    ConsoleAppender,如名称所示,将日志输出到控制台上。

    3.4.2:RollingFileAppender

    RollingFileAppender,是FileAppender的一个子类,扩展了FileAppender,具有翻转日志文件的功能。 例如,RollingFileAppender 可以记录到名为log.txt文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。

    有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即 RollingPolicy 负责执行翻转所需的操作。 RollingFileAppender的第二个子组件,即 TriggeringPolicy 将确定是否以及何时发生翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。

    作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。

    3.4.3:滚动策略

    TimeBasedRollingPolicy:可能是最受欢迎的滚动策略。 它根据时间定义翻转策略,例如按天或按月。 TimeBasedRollingPolicy承担滚动和触发所述翻转的责任。 实际上,TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口。

    SizeAndTimeBasedRollingPolicy:有时您可能希望按日期归档文件,但同时限制每个日志文件的大小,特别是如果后处理工具对日志文件施加大小限制。 为了满足此要求,logback 提供了 SizeAndTimeBasedRollingPolicy ,它是TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。

    3.5:<encoder>元素

     encoder中最重要就是pattern属性,它负责控制输出日志的格式,这里给出一个我自己写的示例:

    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
     

    其中:%d{yyyy-MM-dd HH:mm:ss.SSS}:日期

              %-5level:日志级别

              %highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色

              %thread:打印日志的线程

              %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 

              %logger:日志输出的类名

              %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符

             %cyan:颜色

             %msg:日志输出内容

             %n:换行符

    3.6:<filter>元素

    filter中最重要的两个过滤器为:LevelFilter、ThresholdFilter。

    LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下面配置将只打印INFO级别的日志,其余的全部禁止打印输出:

    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
    ThresholdFilter 过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于INFO级别的日志,只输出INFO以及以上级别的日志:

    <configuration>
      <appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
    四:详细的logback-spring.xml示例:
     

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,
    如果设置为WARN,则低于WARN的信息都不会输出 -->
    <!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
    <!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
                     当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
    <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。
    默认值为false。 -->
    <configuration  scan="true" scanPeriod="10 seconds">
    
    
        <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
        <!-- <property name="log.path" value="F:/logs" />-->
        <springProperty scope="context" name="log.path" source="logging.path" default="/home/logs/"/>
        <contextName>logback</contextName>
    
        <!-- 日志格式和颜色渲染 -->
        <!-- 彩色日志依赖的渲染类 -->
        <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}}"/>
    
        <!--输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>debug</level>
            </filter>
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <!-- 设置字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
        <!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <!--
            日志输出格式:
    			%d表示日期时间,
    			%thread表示线程名,
    			%-5level:级别从左显示5个字符宽度
    			%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
    			%msg:日志消息,
    			%n是换行符
    			%-15.15():如果记录的线程字符长度小于15(第一个)则用空格在右侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符
    			%-50.50():如果记录的logger字符长度小于50(第一个)则用空格在右侧补齐,如果字符长度大于50(第二个),则从开头开始截断多余的字符
    			%highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色
    			%boldMagenta:粗红
    			%magenta:洋红
    			$cyan:青色
    			%white:白色
            -->
            <layout class="ch.qos.logback.classic.PatternLayout">
                <springProfile name="dev">
                    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n</pattern>
                </springProfile>
                <springProfile name="!dev">
                    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n</pattern>
                </springProfile>
            </layout>
        </appender>
    
        <!--控制台打印警告信息的单独处理-->
        <appender name="consoleWarn" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <springProfile name="dev">
                    <pattern>%magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n)</pattern>
                </springProfile>
                <springProfile name="!dev">
                    <pattern>%magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n)</pattern>
                </springProfile>
            </layout>
        </appender>
    
        <!--控制台打印错误信息的单独处理-->
        <appender name="consoleError" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <springProfile name="dev">
                    <pattern>%boldMagenta(%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n)</pattern>
                </springProfile>
                <springProfile name="!dev">
                    <pattern>%boldMagenta(%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight(%-5level) %magenta([%-15.15(%thread)])  %cyan( %-50.50(%logger{50} )) : %msg%n)</pattern>
                </springProfile>
            </layout>
        </appender>
    
    
        <!--输出到文档-->
        <!--level为 DEBUG 日志,时间滚动输出  -->
        <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文档的路径及文档名 -->
            <file>${log.path}/web_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}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
                <!--
                       当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy
                       是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
                   -->
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
    
            </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}/web_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}/web-info-%d{yyyy-MM-dd}.%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}/web_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}/web-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文档只记录warn级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>warn</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--level为 ERROR 日志,时间滚动输出  -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文档的路径及文档名 -->
            <file>${log.path}/web_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}/web-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文档只记录ERROR级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--
            <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
            以及指定<appender>。<logger>仅有一个name属性,
            一个可选的level和一个可选的addtivity属性。
            name:用来指定受此logger约束的某一个包或者具体的某一个类。
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
                  还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
                  如果未设置此属性,那么当前logger将会继承上级的级别。
            addtivity:是否向上级logger传递打印信息。默认是true。
            <logger name="org.springframework.web" level="info"/>
            <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
        -->
    
        <!--
            使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
            第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
            第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
            【logging.level.org.mybatis=debug logging.level.dao=debug】
         -->
    
        <!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
            不能设置为INHERITED或者同义词NULL。默认是DEBUG
            可以包含零个或多个元素,标识这个appender将会添加到这个logger。
        -->
    
        <!--开发环境:打印控制台-->
        <springProfile name="dev">
            <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>
    
        <springProfile name="prod">
            <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>
    
        <springProfile name="test">
            <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>
    

     

    展开全文
  • springboot使用logback日志框架超详细教程

    万次阅读 多人点赞 2018-12-18 17:57:00
     项目中日志系统是必不可少的,目前比较流行的日志框架有log4j、logback等,可能大家还不知道,这两个框架的作者是同一个人,Logback旨在作为流行的log4j项目的后续版本,从而恢复log4j离开的位置。另外 slf4j...

    前言

           项目中日志系统是必不可少的,目前比较流行的日志框架有log4jlogback等,可能大家还不知道,这两个框架的作者是同一个人,Logback旨在作为流行的log4j项目的后续版本,从而恢复log4j离开的位置。另外 slf4j(Simple Logging Facade for Java则是一个日志门面框架,提供了日志系统中常用的接口,logback 和 log4j 则对slf4j 进行了实现。我们本文将讲述如何在spring boot 中应用 logback+slf4j实现日志的记录。

    为什么使用logback

    1. Logback 是log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J
    2. Logback的定制性更加灵活,同时也是spring boot的内置日志框架

    开始使用

    一:添加依赖:maven依赖中添加了spring-boot-starter-logging

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>

    但是呢,实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 Logback+SLF4J。而 spring-boot-starter-web 包含了spring-boot-starte,所以我们只需要引入web组件即可:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    二:默认配置:默认情况下Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性

    注:二者不能同时使用,如若同时使用,则只有logging.file生效
    logging.file=文件名
    logging.path=日志文件路径
    
    logging.level.包名=指定包下的日志级别
    logging.pattern.console=日志打印规则
    • logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
    • logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

    注:二者不能同时使用,如若同时使用,则只有logging.file生效,可以看到这种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。

    三:logback-spring.xml详解

    Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。

    也可以使用自定义的名称,比如logback-config.xml,只需要在application.properties文件中使用logging.config=classpath:logback-config.xml指定即可

    在讲解 log'back-spring.xml之前我们先来了解三个单词:Logger, Appenders and Layouts(记录器、附加器、布局):Logback基于三个主要类:Logger,Appender和Layout。 这三种类型的组件协同工作,使开发人员能够根据消息类型和级别记录消息,并在运行时控制这些消息的格式以及报告的位置。首先给出一个基本的xml配置如下:

    <configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <logger name="chapters.configuration" level="INFO"/>
    
      <!-- Strictly speaking, the level attribute is not necessary since -->
      <!-- the level of the root level is set to DEBUG by default.       -->
      <root level="DEBUG">          
        <appender-ref ref="STDOUT" />
      </root>  
      
    </configuration>

    3.1:<configuration>元素

    logback.xml配置文件的基本结构可以描述为<configuration>元素,包含零个或多个<appender>元素,后跟零个或多个<logger>元素,后跟最多一个<root>元素(也可以没有)。下图说明了这种基本结构:

    3.2:<logger>元素

    <logger>元素只接受一个必需的name属性,一个可选的level属性和一个可选的additivity属性,允许值为true或false。 level属性的值允许一个不区分大小写的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。特殊于大小写不敏感的值INHERITED或其同义词NULL将强制记录器的级别从层次结构中的较高级别继承,<logger>元素可以包含零个或多个<appender-ref>元素; 这样引用的每个appender都被添加到指定的logger中,(注:additivity属性下面详说),logger元素级别具有继承性

    例1:示例中,仅为根记录器分配了级别。 此级别值DEBUG由其他记录器X,X.Y和X.Y.Z继承

    Logger nameAssigned levelEffective level

    root

    DEBUGDEBUG
    XnoneDEBUG
    X.YnoneDEBUG
    X.Y.ZnoneDEBUG

    例2:所有记录器都有一个指定的级别值。 级别继承不起作用

    Logger nameAssigned levelEffective level
    rootERRORERROR
    XINFOINFO
    X.YDEBUGDEBUG
    X.Y.ZWARNWARN

    例3:记录器root,X和X.Y.Z分别被分配了DEBUG,INFO和ERROR级别。 Logger X.Y从其父X继承其级别值。

    Logger nameAssigned levelEffective level
    rootDEBUGDEBUG
    XINFOINFO
    X.YnoneINFO
    X.Y.ZERRORERROR

    例4:在示例4中,记录器root和X分别被分配了DEBUG和INFO级别。 记录器X.Y和X.Y.Z从其最近的父X继承其级别值,该父级具有指定的级别。

    Logger nameAssigned levelEffective level
    rootDEBUGDEBUG
    XINFOINFO
    X.YnoneINFO
    X.Y.ZnoneINFO


    3.3:<root>元素

    <root>元素配置根记录器。 它支持单个属性,即level属性。 它不允许任何其他属性,因为additivity标志不适用于根记录器。 此外,由于根记录器已被命名为“ROOT”,因此它也不允许使用name属性。 level属性的值可以是不区分大小写的字符串TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一<root>元素可以包含零个或多个<appender-ref>元素; 这样引用的每个appender都被添加到根记录器中(注:additivity属性下面详说)。

    3.4:<appender>元素

    appender使用<appender>元素配置,该元素采用两个必需属性name和class。 name属性指定appender的名称,而class属性指定要实例化的appender类的完全限定名称。 <appender>元素可以包含零个或一个<layout>元素,零个或多个<encoder>元素以及零个或多个<filter>元素,下图说明了常见的结构:

    重要在logback中,输出目标称为appender,addAppender方法将appender添加到给定的记录器logger。给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender。换句话说,appender是从记录器层次结构中附加地继承的。例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。如果另外将文件追加器添加到记录器(例如L),则对L和L的子项启用的记录请求将打印在文件和控制台上。通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积

    Appender是一个接口,它有许多子接口和实现类,具体如下图所示:

    其中最重要的两个Appender为:ConsoleAppender 、RollingFileAppender。

    3.4.1:ConsoleAppender

    ConsoleAppender,如名称所示,将日志输出到控制台上

    3.4.2:RollingFileAppender

    RollingFileAppender,是FileAppender的一个子类,扩展了FileAppender,具有翻转日志文件的功能。 例如,RollingFileAppender 可以记录到名为log.txt文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。

    有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即 RollingPolicy 负责执行翻转所需的操作。 RollingFileAppender的第二个子组件,即 TriggeringPolicy 将确定是否以及何时发生翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。

    作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。

    3.4.3:滚动策略

    TimeBasedRollingPolicy:可能是最受欢迎的滚动策略。 它根据时间定义翻转策略,例如按天或按月。 TimeBasedRollingPolicy承担滚动和触发所述翻转的责任。 实际上,TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口。

    SizeAndTimeBasedRollingPolicy:有时您可能希望按日期归档文件,但同时限制每个日志文件的大小,特别是如果后处理工具对日志文件施加大小限制。 为了满足此要求,logback 提供了 SizeAndTimeBasedRollingPolicy ,它是TimeBasedRollingPolicy的一个子类,实现了基于时间和日志文件大小的翻滚策略。

    3.5:<encoder>元素

     encoder中最重要就是pattern属性,它负责控制输出日志的格式,这里给出一个我自己写的示例:

    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>

    使用后的输出格式如下图所示

    其中:%d{yyyy-MM-dd HH:mm:ss.SSS}:日期

              %-5level:日志级别

              %highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色

              %thread:打印日志的线程

              %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 

              %logger:日志输出的类名

              %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符

             %cyan:颜色

             %msg:日志输出内容

             %n:换行符

    3.6:<filter>元素

    filter中最重要的两个过滤器为:LevelFilterThresholdFilter。

    LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下面配置将只打印INFO级别的日志,其余的全部禁止打印输出

    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>

    ThresholdFilter 过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于INFO级别的日志,只输出INFO以及以上级别的日志

    <configuration>
      <appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          </pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>

    四:详细的logback-spring.xml示例:

    以上介绍了xml中重要的几个元素,下面将我配置的xml贴出来以供参考(实现了基于日期和大小翻滚的策略,以及经INFO和ERROR日志区分输出,还有规范日志输出格式等):

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
    
        <!-- appender是configuration的子节点,是负责写日志的组件。 -->
        <!-- ConsoleAppender:把日志输出到控制台 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 默认情况下,每个日志事件都会立即刷新到基础输出流。 这种默认方法更安全,因为如果应用程序在没有正确关闭appender的情况下退出,则日志事件不会丢失。
             但是,为了显着增加日志记录吞吐量,您可能希望将immediateFlush属性设置为false -->
            <!--<immediateFlush>true</immediateFlush>-->
            <encoder>
                <!-- %37():如果字符没有37个字符长度,则左侧用空格补齐 -->
                <!-- %-37():如果字符没有37个字符长度,则右侧用空格补齐 -->
                <!-- %15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符 -->
                <!-- %-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符 -->
                <!-- %msg:日志打印详情 -->
                <!-- %n:换行符 -->
                <!-- %highlight():转换说明符以粗体红色显示其级别为ERROR的事件,红色为WARN,BLUE为INFO,以及其他级别的默认颜色。 -->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
                <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!-- info 日志-->
        <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
        <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
        <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
        <appender name="info_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--日志文件路径和名称-->
            <File>logs/project_info.log</File>
            <!--是否追加到文件末尾,默认为true-->
            <append>true</append>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>DENY</onMatch><!-- 如果命中ERROR就禁止这条日志 -->
                <onMismatch>ACCEPT</onMismatch><!-- 如果没有命中就使用这条规则 -->
            </filter>
            <!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
             RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
            作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
                <!-- 文件名:logs/project_info.2017-12-05.0.log -->
                <!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
                <fileNamePattern>logs/project_info.%d.%i.log</fileNamePattern>
                <!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
                如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
                <maxHistory>30</maxHistory>
                <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
                <totalSizeCap>20GB</totalSizeCap>
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
                <maxFileSize>10MB</maxFileSize>
            </rollingPolicy>
            <!--编码器-->
            <encoder>
                <!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
                <!-- 记录日志的编码:此处设置字符集 - -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!-- error 日志-->
        <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
        <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_error.log -->
        <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
        <appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--日志文件路径和名称-->
            <File>logs/project_error.log</File>
            <!--是否追加到文件末尾,默认为true-->
            <append>true</append>
            <!-- ThresholdFilter过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件 -->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level><!-- 低于ERROR级别的日志(debug,info)将被拒绝,等于或者高于ERROR的级别将相应NEUTRAL -->
            </filter>
            <!--有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即RollingPolicy:负责执行翻转所需的操作。
            RollingFileAppender的第二个子组件,即TriggeringPolicy:将确定是否以及何时发生翻转。 因此,RollingPolicy负责什么和TriggeringPolicy负责什么时候.
           作为任何用途,RollingFileAppender必须同时设置RollingPolicy和TriggeringPolicy,但是,如果其RollingPolicy也实现了TriggeringPolicy接口,则只需要显式指定前者。-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
                <!-- 文件名:logs/project_error.2017-12-05.0.log -->
                <!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
                <fileNamePattern>logs/project_error.%d.%i.log</fileNamePattern>
                <!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
                如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
                <maxHistory>30</maxHistory>
                <!-- 每个日志文件到10mb的时候开始切分,最多保留30天,但最大到20GB,哪怕没到30天也要删除多余的日志 -->
                <totalSizeCap>20GB</totalSizeCap>
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
                <maxFileSize>10MB</maxFileSize>
            </rollingPolicy>
            <!--编码器-->
            <encoder>
                <!-- pattern节点,用来设置日志的输入格式 ps:日志文件中没有设置颜色,否则颜色部分会有ESC[0:39em等乱码-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n</pattern>
                <!-- 记录日志的编码:此处设置字符集 - -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!--给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有appender以及层次结构中较高的appender(不用在意level值)。
        换句话说,appender是从记录器层次结构中附加地继承的。
        例如,如果将控制台appender添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
        如果另外将文件追加器添加到记录器(例如L),则对L和L'子项启用的记录请求将打印在文件和控制台上。
        通过将记录器的additivity标志设置为false,可以覆盖此默认行为,以便不再添加appender累积-->
        <!-- configuration中最多允许一个root,别的logger如果没有设置级别则从父级别root继承 -->
        <root level="INFO">
            <appender-ref ref="STDOUT" />
        </root>
    
        <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
        <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
        <logger name="com.sailing.springbootmybatis" level="INFO">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
    
        <!-- 利用logback输入mybatis的sql日志,
        注意:如果不加 additivity="false" 则此logger会将输出转发到自身以及祖先的logger中,就会出现日志文件中sql重复打印-->
        <logger name="com.sailing.springbootmybatis.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
    
        <!-- additivity=false代表禁止默认累计的行为,即com.atomikos中的日志只会记录到日志文件中,不会输出层次级别更高的任何appender-->
        <logger name="com.atomikos" level="INFO" additivity="false">
            <appender-ref ref="info_log" />
            <appender-ref ref="error_log" />
        </logger>
    
    </configuration>

    五:附加内容

    5.1:这里再说下log日志输出代码,一般有人可能在代码中使用如下方式输出:

    Object entry = new SomeObject(); 
    logger.debug("The entry is " + entry);

    5.2:上面看起来没什么问题,但是会存在构造消息参数的成本,即将entry转换成字符串相加。并且无论是否记录消息,都是如此,即:那怕日志级别为INFO,也会执行括号里面的操作,但是日志不会输出,下面是优化后的写法:

    if(logger.isDebugEnabled()) { 
        Object entry = new SomeObject(); 
        logger.debug("The entry is " + entry);
    }

    5.3:5.2的写法,首先对设置的日志级别进行了判断,如果为debug模式,才进行参数的构造,对第一种写法进行了改善。不过还有最好的写法,使用占位符:

    Object entry = new SomeObject(); 
    logger.debug("The entry is {}.", entry);

    只有在评估是否记录之后,并且只有在决策是肯定的情况下,记录器实现才会格式化消息并将“{}”对替换为条目的字符串值。 换句话说,当禁用日志语句时,此表单不会产生参数构造的成本。

    logback作者进行测试得出:第一种和第三种写法将产生完全相同的输出。 但是,在禁用日志记录语句的情况下,第三个变体将比第一个变体优于至少30倍

    如果有多个参数,写法如下:

    logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

    如果需要传递三个或更多参数,则还可以使用Object []变体:

    Object[] paramArray = {newVal, below, above};
    logger.debug("Value {} was inserted between {} and {}.", paramArray);

    5.4:记录日志的时候我们可能需要在文件中记录下异常的堆栈信息,经过测试,logger.error(e) 不会打印出堆栈信息,正确的写法是:

    logger.error("程序异常, 详细信息:{}", e.getLocalizedMessage() , e);

    完~

    展开全文
  • Springboot系列文章 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的...logback日志详解Springboot系列文章前言为什么使用logback一、日志框架概述二、日志操作步骤1. pom加入依赖2.
  • Logback是一个开源日志组件。Logback一般和SLF4结合起来使用。外层使用SLF4J,里面的实现是logback。什么意思,简单来说我们使用层看到的是SLF4J。我们使用的时候就是和SLF4J提供的一些api打交道。     &...
  • 笔者声明 该内容参考自 logback官方网站 及一 国外博客 ,其中关于日志写入远程服务器笔者没来得及亲自试,只是将官方文档进行了简单翻译,部分语法拿捏的并不准确。其中每部分都有指出官网的章节地址,建议看不懂的...
  • Logback第四章:Appenders

    2021-04-16 09:01:09
    logback 将写入日志事件的任务委托给一个名为 appender 的组件。Appender 必须实现 ch.qos.logback.core.Appender 接口。该接口的方法如下: package ch.qos.logback.core; import ch.qos.logback.core.spi....
  • logback 入门教程系列-06-logback Layout

    万次阅读 2018-11-22 22:07:33
    如果数据项包含少的字符,则会在左侧或右侧填充,直到达到最小宽度。默认设置是在左侧填充(右对齐),但您可以使用左对齐标志指定右填充。填充字符是空格。如果数据项大于最小字段宽度,则扩展该字段以容纳数据。...
  • logback

    2018-05-20 21:44:00
    变量多时可以使用properties文件 logback会去读取    “resource1.properties” /> classpath 引用资源  <appender name="FILE" class="ch.qos.logback.core.FileAppender">   ${USER_HOME}/...
  • Logback 那么,对于 Spring、Hibernate 等框架,会有打日志的需求,那么就需要选择相应的日志框架。但是,它们无论选择任一一个日志框架,可能使用 Spring、Hibernate 等框架的项目,希望选择另外一个日志框架。...
  • 文章目录0 前言1 名词术语2 日志记录2.1 默认零配置记录日志2.1.1 使用日志记录器打印日志2.1.2 日志记录器的日记级别2.1.3 日志记录器的日志记录格式2.1.4 将日志输出到文件2.1.5 日志彩色输出2.1.6 自定义日志配置...
  • 分布式系统中的日志落地经验总结

    千次阅读 2018-11-14 09:18:18
    @分布式系统中的日志落地经验总结 在过去的2年多的时间里,随着在公司推进容器云,陆陆续续的和日志打了不少交道,在这里做一个总结: 为什么需要日志 日志如何接收与存储 日志如何收集 日志收集客户端分析 日志的...
  • 这里要指定日志的目录,我是放到 jar包的同一级目录 <?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <!-- appender是configuration的子节点,是负责写日志的组件。 -->...
  • logback日志的集成 总结: SpringBoot底层也是使用slf4j+logback的方式进行日志记录 logback桥接:logback-classic SpringBoot也把其他的日志都替换成了slf4j; log4j 适配: log4j-over-slf4j jul适配:jul-to-slf...
  • Logback 格式修饰器(Format modifiers) 默认情况下日志输出是未加任何修饰的。然而,格式修饰器可以帮助改变每个数据字段的最小、最大宽度和如何处理超长的字符。 可选的格式修饰符是放置百分号和转换字符或字...
  • springboot日志

    2018-11-13 11:27:23
    Spring Boot使用Commons Logging进行所有内部日志记录,但使基础日志实现开放。 默认配置提供了Java Util Logging,Log4J2和Logback。 在每种情况下,记录器都预先配置为使用控制台输出和可选文件输出都可用。 默认...
  • timeout_in_ms: 30000 # 协调器应继续重试与同一行的其他提议相抵触的 CAS 操作的时间 cas_contention_timeout_in_ms: 30000 # 协调器应等待多时间才能完成截断操作(这可能会更,因为除非禁用了auto_...
  • Java日志框架介绍

    千次阅读 2015-02-28 16:49:03
    概述 在刚接触日志框架时,被很多日志框架搞的头晕,下面将整体介绍下当前流行...JDK自带日志框架(java.util.logging),由于效率及灵活性差,目前使用的少 http://docs.oracle.com/javase/1.5.0/docs/guide/log
  • 做java的,一般小项目都是使用logback配置控制台、文件等对日志进行记录和持久化,但是随着微服务架构的越来越流行,各种微服务模块越来越多,节点也越来越多,线上日志的排查和访问统计也跟着变的更复杂和不便。...
  • SpringCloud Alibaba 教程

    2021-08-08 15:41:31
    } } feign日志日志级别为debug,但是SpringBoot的默认日志级别为InFo 需要配置才能打印出feign日志 #springboot 默认的日志级别是info,改为debug logging: level: #指定这个包下的日子为debug org.gjw.feign.*: ...
  • Java 超全面试题

    千次阅读 2020-04-23 10:33:11
    (来访问题,怎么确定日志打到哪里了) 工具 1.maven中怎么排除包冲突 2.IDEA合并代码怎么做? 分布式 1.如何实现分布式锁 2.分布式Session怎样实现 3.如何消除分布式事务 4.MetaQ,Zookeeper的原理和适用场景 5....
  • 《阿里巴巴JAVA编码规范》阅读理解

    千次阅读 2018-08-01 15:49:51
    由于解读文章仅有两篇,所以按照阿里的篇幅权重分为上篇仅针对 Java 语言本身的编码规约,下篇包含日志管理、异常处理、单元测试、MySQL 规范、工程规范等方面内容进行解读。本文是上篇,主要针对编码规约部分进行...
  • 2.24.6改用Log4j2日志实现 2.24.7Logback扩展 2.25自动配置概述 2.25.1自动配置的替换原则 2.25.2禁用特定的自动配置 2.26创建自己的自动配置 2.26.1自动配置的本质 **`重点:mybatis自动配置原理`** **`重点:如何...
  • 这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。 1、Loggers Loggers组件在此系统中被分为五...
  • 文字里面提到Java方面的编程规约平时到时有遵守到,但是在异常日志、安全规约,数据库、工程规约、设计规范这些,本人已经看傻了,很多都没接触过,或者说没有过系统的思考,不得不感叹自己的经验和认知还差太多了。...
  • 清单 5 清单 4 程序运行输出 start finally 10 日志规约 不可直接使用日志系统 阿里强制规定应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架...
  • Spring Boot 1.5.2.RELEASE中文版

    千次阅读 2019-08-01 21:54:50
    Spring Boot 1.5.2.RELEASE中文版 Part I. Spring Boot 文档 本节简要介绍了Spring Boot文档,是整个文档的参考指南。 您可以完整阅读本参考指南,或者如果您不感兴趣的话可以跳过该部分。 1. 关于文档 ...
  • Springboot Feature翻译

    2020-09-11 15:22:16
    Started SampleApplication in 2.992 seconds (JVM running for 3.658) 默认情况下,将会打印 INFO 级别的日志消息,包括一些有关启动的详细信息,比如开启应用的用户,你也可以修改日志级别,具体的可以查看 [Log ...

空空如也

空空如也

1 2 3 4 5
收藏数 85
精华内容 34
关键字:

logback打印日志较长截断