精华内容
下载资源
问答
  • springboot+logback自定义日志
    更多相关内容
  • 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>
    
    展开全文
  • 由于使用的是logback日志框架,logback提供了自定义Layout,可以自定义日志的输出形式。 创建LogstashLayout类: package com.example.zrf.config; import ch.qos.logback.classic.Level; import ch.qos.logback....

    在使用elk收集日志时,要求程序输出JSON格式日志,以便Logstash进行过滤处理。由于使用的是logback日志框架,logback提供了自定义Layout,可以自定义日志的输出形式。
    创建LogstashLayout类:

    package com.example.zrf.config;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.core.LayoutBase;
    import com.alibaba.fastjson.JSONObject;
    import org.apache.http.client.utils.DateUtils;
    import org.springframework.util.StringUtils;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.Date;
    import java.util.Map;
    
    public class LogstashLayout extends LayoutBase<ILoggingEvent> {
    
    
        @Override
        public String doLayout(ILoggingEvent loggingEvent) {
            String separator = System.lineSeparator();
            JSONObject logstashEvent = new JSONObject(true);
            Map<String, String> mdcPropertyMap = loggingEvent.getMDCPropertyMap();
            //设置系统时间
            long timeStamp = loggingEvent.getTimeStamp();
            logstashEvent.put("systemTime", DateUtils.formatDate(new Date(timeStamp), "yyyy-MM-dd HH:mm:ss.SSS"));
            //设置日志级别
            Level level = loggingEvent.getLevel();
            logstashEvent.put("level", level.levelStr);
            //设置类路径
            String className = loggingEvent.getLoggerName();
            StackTraceElement[] data = loggingEvent.getCallerData();
            if (data != null && data.length > 0) {
                String fileName = data[0].getFileName();
                int lineNumber = data[0].getLineNumber();
                String methodName = data[0].getMethodName();
                className = className + "." + methodName + "(" + fileName + ":" + lineNumber + ")";
            }
            logstashEvent.put("className", className);
            //设置服务器名称
            try {
                InetAddress localhost = InetAddress.getLocalHost();
                logstashEvent.put("hostAddress", localhost.getHostAddress());
                logstashEvent.put("hostName", localhost.getHostName());
            } catch (UnknownHostException e) {
                logstashEvent.put("hostAddress", "unKnown");
                logstashEvent.put("hostName", "unKnown");
            }
            //设置message
            String message = loggingEvent.getFormattedMessage();
            logstashEvent.put("msg", message);
            //设置异常信息
            if (loggingEvent.getThrowableProxy() != null) {
                setErrLogDetails(loggingEvent, logstashEvent);
            }
            return logstashEvent + separator;
        }
    
        /**
         * 设置异常信息
         * @param loggingEvent
         * @param logstashEvent
         */
        private void setErrLogDetails(ILoggingEvent loggingEvent, JSONObject logstashEvent) {
            IThrowableProxy throwableProxy = loggingEvent.getThrowableProxy();
            //设置异常的类
            String exceptionClass = throwableProxy.getClassName();
            if (!StringUtils.isEmpty(exceptionClass)) {
                exceptionClass = exceptionClass.replace(".", "_");
            }
            logstashEvent.put("exceptionClass", exceptionClass);
            //设置异常描述信息
            String errMsg = throwableProxy.getMessage();
            logstashEvent.put("errMsg", errMsg);
            //设置堆栈信息
            ExtendedThrowableProxyConverter converter = new ExtendedThrowableProxyConverter();
            String stackInfo = converter.convert(loggingEvent);
            logstashEvent.put("stackInfo", stackInfo);
            converter.stop();
        }
    }
    

    在logback配置文件中配置该layout,这里以配置控制台输出的appender为例:

    <?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="60 seconds">
    
        <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
    
        <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"/>
    
        <!--从SpringBoot配置文件读取项目名,环境,以及logstash地址-->
        <springProperty scope="context" name="springAppName" source="spring.application.name"/>
        <springProperty scope="context" name="springProfile" source="spring.profiles.active"/>
    
        <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
        <property name="log.path" value="log"/>
        <!-- 彩色日志格式 -->
        <property name="CONSOLE_LOG_PATTERN"
                  value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([%X{traceId}]){cyan} %clr([%X{channel}]){blue} %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="FILE_PATTERN"
                  value="[${springAppName:-}] [${springProfile:-}] %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} [%X{traceId}] [%thread] %-5level %logger{50} - %msg%n"/>
    
        <!--输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>info</level>
            </filter>
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="com.example.zrf.config.LogstashLayout"/>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="CONSOLE"/>
        </root>
    </configuration>
    

    启动SpringBoot,可以看到控制台输出的是JSON格式日志:
    在这里插入图片描述

    展开全文
  • Logback设置日志级别

    万次阅读 2019-01-31 10:57:25
    使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途。首先列举常用的三种方式,接下来说明其区别。

    使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途。首先列举常用的三种方式,接下来说明其区别。

    • appender中的LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志
     <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>   
       ...
     </appender>   
    
    • appender中的ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL。跟LevelFilter的区别在于一个是区间,一个是单点。
     <appender name="CONSOLE"   class="ch.qos.logback.core.ConsoleAppender">   
       <!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->   
       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">   
         <level>INFO</level>   
       </filter>   
       ...
     </appender>   
    
    • logger中的Level:用来设置指定名称的日志级别,如果不设定,那么采用父类的level,最顶级的父类是ROOT,一般用来调整指定类的日志级别,其规则为等于或者高于设定level的日志才可能输出(注意是可能,因为还要看appender的设置)
    <logger level="TRACE" name="com.test.pk1"/>
    

    那么以上几种应该如何使用,如何生效?

    如何生效:可以这样理解日志的处理流水线:

    1. 先判断logger的level,如果不满足直接丢弃不打印,如果满足进入下一步
    2. 找到关联的appender,根据appender的filter对日志进行过滤

    如何应用:通过logger设置日志的level比较常见,也比较容易理解。既然已经能够通过logger的level控制日志按照级别输出,appender的filter什么时候用?
    主要应用的场景是:按照日志级别保存不同的文件。比如等于或高于error级别保存到log_error.log文件,等于或高于warn级别保存到log_warn.log文件(深究一下:为什么要按照级别保存不同的文件?方便发现问题,因为实际应用中DEBUG级别的日志量往往很大,通过日志分级别保存,可以直接看error级别的日志,快速发现问题)。Example:

        <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="WarnLogFile">
            ...
            <file>${LOGS_DIR}/log-warn.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level>
            </filter>
            ...
        </appender>
        
        <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="InfoLogFile">
            ...
            <file>${LOGS_DIR}/log-info.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            ...
        </appender>
        
        <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="DebugLogFile">
            ...
            <file>${LOGS_DIR}/log-debug.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUG</level>
            </filter>
            ...
        </appender>
    
    展开全文
  • logback自定义日志文件

    2019-07-29 17:13:07
    一、自定义文件路径 1、application.yml 添加配置 spring: application: name: test logging: config: path: logs/${spring.application.name} 2、logback-spring.xml 添加配置 <springProperty scop=...
  • logback日志级别动态切换的四种方案

    千次阅读 2020-01-29 16:50:09
    springboot日志级别动态切换
  • 3306/mydbserverTimezone=GMT%2B8&characterEncoding=utf8 * * db_classic_mysql_pool" /> 步骤三: 配置自定义日志类 import ch.qos.logback.classic.spi.CallerData; import ch.qos.logback.classic.spi....
  • 本例想实现对类或者包中的日志,自定义级别输出方法一1、自定义日志级别方式如下:代码文件:Logger monitorLogger = LoggerFactory.getLogger("monitor"); //在声明实例时创建自定义级别标签,monitor就是自定义的...
  • 问题:一般生产环境的日志...1.自定义api动态修改日志级别 2. 集成第三方工具 1)集成boot-admin或actuator pom.xml引入包 <dependency> <groupId>de.codecentric</groupId> <artifa...
  • Logback自定义日志颜色

    万次阅读 2018-09-09 16:20:08
    在平时的开发中,我们也可以通过logback的配置来自定义日志的颜色 本次主要演示如何自定义不同日志等级的配色 留意:IDEA控制台和Linux控制台能够显示配色,Windows下PowerShell不支持该配色,Eclipse控制台...
  • 而一般开发环境和测试环境可以把日志级别设置成 info 级别,方便在联调与测试中解决遇到的bug,但是生产环境因为存在大量的业务,如果采用 info 级别的日志, 那么每一笔交易或者业务都打印大量的日志。这样的花需要...
  • springboot logback调整mybatis日志级别无效的解决现象在日志配置文件 logback-spring.xml 中,无论怎么修改级别,mybatis 的 sql 日志都会打印出来。原因在 application.yml 中配置了 mybatis 的自定义日志类,如下...
  • 1、application.yml中配置,指定如下路径后,可以在打包后的jar文件同级目录放置logback.xml: logging: config: logback.xml ...-- 该配置指定控制台输出日志信息,包含各个级别日志 --> ...
  • LogBack 日志级别 TRACE < DEBUG < INFO < WARN < ERROR TRACE 级别最小,打印信息最为详细,一般不会使用。 DEBUG指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些...
  • 以下只贴出核心代码,运行代码详见这里 背景 ...因为是中途接手的项目,对于接口性能的监控比较好奇,就花了点时间了解下,又学了一手,写了个例子,记录下。...业务类(需要打印日志的类) HandleAppender l...
  • logback自定义配置文件

    2022-02-28 14:30:58
    -- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新...
  • SpringBoot 使用logback级别记录日志

    千次阅读 2019-01-02 14:59:55
    SpringBoot 默认使用logback记录日志,相关的包为:spring-boot-starter-logging.jar被包含在start-web中。 在SpringBoot中使用logback,只需要引入  &lt;dependency&gt; &lt;groupId&gt;...
  • 1、自定义日志级别方式如下: 代码文件:Logger monitorLogger = LoggerFactory.getLogger(“monitor”); //在声明实例时创建自定义级别标签,monitor就是自定义的标签。 2、输出日志采用这样的方式: ...
  • 1.控制台输出 ...-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5l.
  • 日志级别之前增加自定义字段

    千次阅读 2017-03-21 19:04:12
    最近阅读zookeeper源代码,发现可以通过logback日志级别之前能够增加自定义字段。 举例:在日志中增加myid :serverid 输出方式:2017-03-08 01:09:51,763 [myid:2] - INFO [SyncThread:2:FileTxnLog@...
  • 使用logback输出日志总结

    千次阅读 多人点赞 2021-08-02 18:02:33
    1.日志级别 logback有5种级别,分别是TRACE 、 DEBUG 、INFO 、WARN 、ERROR,定义于ch.qos.logback.classic.Level类中,如下: 如上图: Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该...
  • logback配置自定义日志格式,用于日志文件暂时存储,使用filebeat进行文件读取传输 1.logback 日志文件格式配置 <appender name="system" class="ch.qos.logback.core.rolling.RollingFileAppender"> <...
  • SpringBoot默认集成的日志框架就是LogBack,无需做任何操作。 第一步:application.properties 配置LogBack #logback日志配置 logging.config=classpath:logback.xml classpath会自动扫描资源包下的全部匹配...
  • --spring-boot-starter-logging 日志启动器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifac
  • Spring_Cloud自定义LogBack记录日志

    千次阅读 2018-01-12 23:07:34
    最近闲暇之余,想研究一下Spring Cloud的eureka的集群以及RBC调用,在本地测试调试,日志肯定少不了,所以就顺便把logback自定义实现了一下,谁知遇到的坑还真不少;列出来作为记录并与广大有此需求的同胞共享与...
  • 是基于日志级别的可自定义日志着色器,用于 。 与使用 关键字提供的内置颜色相比,此扩展名的可定制性要好得多。 适用于任何logback实现,例如 , 。 快速开始 将添加到项目的类路径中。 配置使用不同的日志级别的...
  • 控制日志级别:在第三个变量传入级别,然后结合末尾处的<root>实现控制,传入info时,只有info、warn、error会有内容,传入warn则只有warn、error会有内容,以此类推。 输出格式自定义:在<appender name=...
  • 一、需要掌握了解logback配置文件各个标签的使用...:筛选日志事件,对于Logback委托给它的日志事件,SiftingAppender会对日志事件做一些区分,然后不同的事件SiftingAppender会委托不同的appender去完成真正的写操作。
  • SpringBoot不重启修改日志级别【Slf4jj动态日志级别】 前言 需求: 线上日志级别高,而定位问题时需要低级别日志便于分析问题 功能:不重启服务器,提供设置页,手动触发Slf4j 项目日志级别变化 扩展:可将此功能放...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,510
精华内容 2,604
关键字:

logback自定义日志级别