springboot推荐使用logback-spring.xml而不是logback.xml
而logback-spring.xml文件与logback.xml文件还是有一定的区别,所以简单讲解一下。
一、logback-spring.xml
配置文件实例:
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
- <contextName>logbackcontextName>
-
-
- <springProperty scope="context" name="myLogLocation" source="logging.file-location" default="/var/log/myapp"/>
- <property name="log.path" value="${myLogLocation}"/>
-
-
-
- <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">
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>debuglevel>
- filter>
- <encoder>
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/debug.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>debuglevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/info.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>infolevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/warn.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>warnlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/error.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERRORlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/all.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>DEBUGlevel>
- <onMatch>DENYonMatch>
- <onMismatch>ACCEPTonMismatch>
- filter>
- appender>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.xusanduo.demo" level="debug"/>
- springProfile>
-
- <springProfile name="test">
- <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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.xusanduo.demo" level="info"/>
- springProfile>
-
- <springProfile name="pro">
- <root level="info">
-
- <appender-ref ref="DEBUG_FILE" />
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="WARN_FILE" />
- <appender-ref ref="ERROR_FILE" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.xusanduo.demo" level="warn"/>
- <logger name="com.xusanduo.demo.MyApplication" level="info"/>
- springProfile>
-
- configuration>
-
大部分标签都比较类似,简单说一下:
共有一个父标签、两种属性、三个节点: (与logback.xml类似)
一个父标签:configuration
两种属性:contextName和property
三个节点:appender、root、logger
当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
- <configuration scan="true" scanPeriod="10 seconds">
- configuration>
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。如果这两个配置文件的contextName不同,就会报错:
- # logback.xml
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="60 seconds" debug="false">
- <contextName>logbackcontextName>
- configuration>
-
- 12345
- # logback-spring,xml
- "1.0" encoding="UTF-8"?>
- <configuration scan="false" scanPeriod="60 seconds" debug="false">
- <contextName>logback_democontextName>
- configuration>
-
- 12345
- # application.properties
- logging.config=classpath:logback-spring.xml
-
- 12
ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rename context [logback] as [logback_demo] java.lang.IllegalStateException: Context has been already given a name 1
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
例如使用定义上下文名称,然后在设置logger上下文时使用。
- <configuration scan="true" scanPeriod="60 seconds" debug="false">
- <property name="APP_Name" value="myAppName" />
- <contextName>${APP_Name}contextName>
- configuration>
就相当于自定义一个全局变量!
1.该
2.标签的工作方式与Logback的标准
意思就是可以读取properties配置文件中的属性。读取示例如下:
1.yml配置
logging:
name: app
2.xml配置
使用springProperty标签读取yml配置
标签配置解读:scope 作用区域:context全局
name 变量名
source 资源值(yml对应资源)
defaultValue 默认值
3.使用
直接使用${变量名}
定义转换器,可以用来对日志进行特殊的转换,比如,SpringBoot后启动项目控制台会带有彩色日志样式,是因为使用了org.springframework.boot.logging.logback.ColorConverter颜色转换器,会把日志用AnsiOutput进行输出。就是可以用来进行彩色日志转换。
-
-
- <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 和 class。
元素可以包含零个或一个元素,零个或多个元素以及零个或多个元素。
下图说明了常见的结构:
重要:在 logback 中,输出目标称为 appender,addAppender 方法将 appender 添加到给定的记录器 logger。
给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有 appender 以及层次结构中较高的 appender。 换句话说,appender 是从记录器层次结构中附加地继承的。
例如,如果将控制台 appender 添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。
如果另外将文件追加器添加到记录器(例如L),则对 L 和 L 的子项启用的记录请求将打印在文件和控制台上。
通过将记录器的 additivity 标志设置为 false,可以覆盖此默认行为,以便不再添加 appender 累积。
Appender 是一个接口,它有许多子接口和实现类,具体如下图所示:
其中最重要的两个Appender为:ConsoleAppender 、RollingFileAppender。
ConsoleAppender,如名称所示,将日志输出到控制台上。
RollingFileAppender,是 FileAppender 的一个子类,扩展了 FileAppender,具有翻转日志文件的功能。
例如,RollingFileAppender 可以记录到名为 log.txt 文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。
有两个与 RollingFileAppender 交互的重要子组件。
因此,RollingPolicy 负责什么和 TriggeringPolicy 负责什么时候。
作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。
但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。
TimeBasedRollingPolicy:可能是最受欢迎的滚动策略。它根据时间定义翻转策略,例如按天或按月。
TimeBasedRollingPolicy 承担滚动和触发所述翻转的责任。实际上,TimeBasedTriggeringPolicy 实现了 RollingPolicy 和 TriggeringPolicy 接口。
SizeAndTimeBasedRollingPolicy:有时您可能希望按日期归档文件,但同时限制每个日志文件的大小,特别是如果后处理工具对日志文件施加大小限制。为了满足此要求,logback 提供了 SizeAndTimeBasedRollingPolicy ,它是 TimeBasedRollingPolicy 的一个子类,实现了基于时间和日志文件大小的翻滚策略。
encoder:encoder 中最重要就是 pattern 属性,它负责控制输出日志的格式,这里给出一个我自己写的示例:
%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n

输出格式
- %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:换行符
通常encoder标签中只需要设置两个标签:
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
5)、filter级别过滤器 ch.qos.logback.classic.filter.LevelFilter。对指定级别的日志进行具体的操作阀值过滤器 ch.qos.logback.classic.filter.ThresholdFilter。表达式过滤器 ch.qos.logback.core.filter.EvaluatorFilter。
Groovy的表达式 ch.qos.logback.classic.boolex.GEventEvaluator。Java的表达式ch.qos.logback.classic.boolex.JaninoEventEvaluator。使用 Janino 解析java script。包含标记 ch.qos.logback.classic.boolex.OnMarkerEvaluatorfilter 中最重要的两个过滤器为: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>INFOlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- 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">
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>INFOlevel>
- filter>
- <encoder>
- <pattern>
- %-4relative [%thread] %-5level %logger{30} - %msg%n
- pattern>
- encoder>
- appender>
- <root level="DEBUG">
- <appender-ref ref="CONSOLE" />
- root>
- configuration>
logger 和 rootlogger对单个包或类添加配置,相当于局部配置,root相当于全局配置
意思就是说,logger标签可以对某个类进行单独配置,而root是整体配置。
举例说明:
logger对单个包或类添加配置:
- <logger name="com.pikaqiu.logbackdemo" level="debug" additivity="false">
- <appender-ref ref="CONSOLE" />
- logger>
-
- <logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO" additivity="true">
- <appender-ref ref="STDOUT"/>
- logger>
元素。这样引用的每个 appender 都被添加到指定的 logger 中,logger 元素级别具有继承性。如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍!
- <root level="DEBUG">
- <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="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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="debug"/>
- springProfile>
-
- <springProfile name="test">
- <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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="info"/>
- springProfile>
-
- <springProfile name="pro">
- <root level="info">
-
- <appender-ref ref="DEBUG_FILE" />
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="WARN_FILE" />
- <appender-ref ref="ERROR_FILE" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="warn"/>
- <logger name="com.shen.test.MyApplication" level="info"/>
- springProfile>
7、included
在微服务里使用了logback来对日志输出进行配置,由于配置文件里有很多通用的设置,所以有必要将通用的都提取到一个公共文件里,这样所有的微服务更改配置格式的话,只需更新通用文件即可,不用每个地方都改一遍了。
如果一个logback.xml文件想在其他的项目中被引用,那么就需要用iucluded标签,将定义的appender跟logger包围起来,表示这个是可以被导入其他项目的。
下面的是通用配置文件:logback-common.xml:
- "1.0" encoding="UTF-8" ?>
- <included>
-
- <appender name="${CONSOLE_APPENDER}" class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>
- [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
- pattern>
- layout>
- appender>
-
-
- <appender name="${FILE_INFO_APPENDER}" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>INFOlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- <encoder>
- <pattern>
- [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
- pattern>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${LOG_DIR}/${LOG_SERVICE_NAME}-info.%d.logfileNamePattern>
- <maxHistory>${LOG_HIS_MAX}maxHistory>
- <totalSizeCap>${LOG_TOTAL_SIZE}totalSizeCap>
- <cleanHistoryOnStart>truecleanHistoryOnStart>
- rollingPolicy>
- appender>
- <appender name="${FILE_ERROR_APPENDER}" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>ERRORlevel>
- filter>
- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>
- [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
- pattern>
- layout>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${LOG_DIR}/${LOG_SERVICE_NAME}-error.%d.logfileNamePattern>
- <maxHistory>${LOG_HIS_MAX}maxHistory>
- <totalSizeCap>${LOG_TOTAL_SIZE}totalSizeCap>
- <cleanHistoryOnStart>truecleanHistoryOnStart>
- rollingPolicy>
- appender>
-
- <springProfile name="dev">
- <root level="info">
- <appender-ref ref="${CONSOLE_APPENDER}"/>
- <appender-ref ref="${FILE_INFO_APPENDER}"/>
- <appender-ref ref="${FILE_ERROR_APPENDER}"/>
- root>
- springProfile>
- <springProfile name="uat">
- <root level="error">
- <appender-ref ref="${CONSOLE_APPENDER}"/>
- <appender-ref ref="${FILE_INFO_APPENDER}"/>
- <appender-ref ref="${FILE_ERROR_APPENDER}"/>
- root>
- springProfile>
- included>
下面的是每个微服务自己的配置文件:logback-spring.xml:
- "1.0" encoding="UTF-8" ?>
- <configuration>
-
- <property scope="local" name="LOG_SERVICE_NAME" value="demo" />
-
- <property scope="local" name="LOG_DIR" value="/data/log" />
-
- <property scope="local" name="LOG_HIS_MAX" value="10" />
- <property scope="local" name="LOG_TOTAL_SIZE" value="2GB" />
-
- <property scope="local" name="CONSOLE_APPENDER" value="consoleLog" />
- <property scope="local" name="FILE_INFO_APPENDER" value="fileInfoLog" />
- <property scope="local" name="FILE_ERROR_APPENDER" value="fileErrorLog" />
-
- <include resource="logback-common.xml"/>
- configuration>
在测试过程中出现了一个问题,就是控制台输出的日志时间是正常的,但在日志文件里输出的日志时间和实际时间相差了8个小时,判断是logback的配置文件还需要加上时区,如下:
- <pattern>
- [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
- pattern>
在时间格式后面增加了 GMT+8,表示输出的日志时区设定为东8区,即北京时间。
经过测试发现问题解决,文件里显示的也是实际时间了。
配置文件 示例:
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="60 seconds" debug="false">
-
-
- <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
- <springProperty scope="context" name="APP_PORT" source="server.port"/>
-
-
- <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="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [${APP_NAME:-APP} %clr(${APP_PORT:-}){blue}] %clr(${PID:- }){magenta} %clr(%5p) %clr([%15.15t]){faint} %clr(%-40.40logger{39} %-4line){cyan} %clr(:){faint} %m%n%wEx"/>
-
-
- <property name="FILE_LOG_PATTERN"
- value="%d{yyyy-MM-dd HH:mm:ss.SSS} [${APP_NAME:-APP}] %5p ${PID:- } [%15.15t] %-40.40logger{39} %-4line : %m%n%wEx"/>
-
-
-
- <property name="LOG_FILE" value="logs/log"/>
-
-
- <property name="ROLLINGPOLICY_FILE_NAME_PATTERN" value="${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz"/>
-
-
- <property name="ROLLINGPOLICY_MAX_FILE_SIZE" value="20MB"/>
-
-
- <property name="ROLLINGPOLICY_TOTAL_SIZE_CAP" value="1GB"/>
-
-
- <property name="ROLLINGPOLICY_CLEAN_HISTORY_ON_START" value="true"/>
-
-
- <property name="ROLLINGPOLICY_MAX_HISTORY" value="10"/>
-
-
-
- <appender name="CONSOLE_OUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <pattern>${CONSOLE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
- <appender name="FILE_OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <pattern>${FILE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- <file>${LOG_FILE}file>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
- <fileNamePattern>${ROLLINGPOLICY_FILE_NAME_PATTERN}fileNamePattern>
- <cleanHistoryOnStart>${ROLLINGPOLICY_CLEAN_HISTORY_ON_START}cleanHistoryOnStart>
- <maxFileSize>${ROLLINGPOLICY_MAX_FILE_SIZE}maxFileSize>
- <totalSizeCap>${ROLLINGPOLICY_TOTAL_SIZE_CAP}totalSizeCap>
- <maxHistory>${ROLLINGPOLICY_MAX_HISTORY}maxHistory>
- rollingPolicy>
- appender>
-
-
-
-
- <appender name="ASYNC_CONSOLE_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
-
- <discardingThreshold>0discardingThreshold>
-
- <queueSize>1024queueSize>
-
- <neverBlock>falseneverBlock>
-
- <includeCallerData>trueincludeCallerData>
-
- <appender-ref ref ="CONSOLE_OUT"/>
- appender>
-
- <appender name="ASYNC_FILE_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
-
- <discardingThreshold>0discardingThreshold>
-
- <queueSize>1024queueSize>
-
- <neverBlock>falseneverBlock>
-
- <appender-ref ref ="FILE_OUT"/>
- appender>
-
-
- <root level="INFO">
-
- <appender-ref ref="ASYNC_CONSOLE_APPENDER"/>
- <appender-ref ref="ASYNC_FILE_APPENDER"/>
- root>
- configuration>
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
-
- <contextName>MyContextNamecontextName>
-
-
- <springProperty name="serverName" source="logging.file.name" defaultValue="MyServerName"/>
- <springProperty name="logging.path" source="logging.file.path" defaultValue="././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}}"/>
-
-
-
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>debuglevel>
- filter>
- <encoder>
-
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${logging.path}/web_debug.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
-
- <fileNamePattern>${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
-
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>debuglevel>
-
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${logging.path}/web_info.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${logging.path}/web-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>infolevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
- <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${logging.path}/web_warn.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>warnlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${logging.path}/web_error.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${logging.path}/web-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERRORlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
- <springProfile name="dev">
- <logger name="com.myClass.controller" 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>
- configuration>
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
- <contextName>logback-testcontextName>
-
-
-
- <property name="log.path" value="/opt/test/log"/>
-
-
-
- <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">
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>debuglevel>
- filter>
-
- <encoder>
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/debug.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
-
- <totalSizeCap>10GBtotalSizeCap>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>debuglevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/info.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>infolevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/warn.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>warnlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/error.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERRORlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/all.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
-
- <maxHistory>15maxHistory>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>DEBUGlevel>
-
- <onMatch>DENYonMatch>
-
- <onMismatch>ACCEPTonMismatch>
- filter>
- appender>
-
-
-
-
-
-
- <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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="debug"/>
- springProfile>
-
- <springProfile name="test">
- <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" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="info"/>
- springProfile>
-
- <springProfile name="pro">
- <root level="info">
-
- <appender-ref ref="DEBUG_FILE" />
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="WARN_FILE" />
- <appender-ref ref="ERROR_FILE" />
- <appender-ref ref="ALL_FILE" />
- root>
- <logger name="com.shen.test" level="warn"/>
- <logger name="com.shen.test.MyApplication" level="info"/>
- springProfile>
-
- configuration>
- "1.0" encoding="UTF-8"?>
- <configuration debug="true">
-
-
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-
-
- <encoder>
-
-
-
-
-
-
-
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%npattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
-
-
- <appender name="info_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <File>logs/project_info.logFile>
-
- <append>trueappend>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERRORlevel>
- <onMatch>DENYonMatch>
- <onMismatch>ACCEPTonMismatch>
- filter>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>logs/project_info.%d.%i.logfileNamePattern>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
-
- <maxFileSize>10MBmaxFileSize>
- rollingPolicy>
-
- <encoder>
-
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%npattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
-
-
- <appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <File>logs/project_error.logFile>
-
- <append>trueappend>
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>ERRORlevel>
- filter>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>logs/project_error.%d.%i.logfileNamePattern>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
-
- <maxFileSize>10MBmaxFileSize>
- rollingPolicy>
-
- <encoder>
-
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%npattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
- <root level="INFO">
- <appender-ref ref="STDOUT" />
- root>
-
-
-
- <logger name="com.sailing.springbootmybatis" level="INFO">
- <appender-ref ref="info_log" />
- <appender-ref ref="error_log" />
- logger>
-
-
- <logger name="com.sailing.springbootmybatis.mapper" level="DEBUG" additivity="false">
- <appender-ref ref="info_log" />
- <appender-ref ref="error_log" />
- logger>
-
-
- <logger name="com.atomikos" level="INFO" additivity="false">
- <appender-ref ref="info_log" />
- <appender-ref ref="error_log" />
- logger>
-
- configuration>
- "1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
-
- <contextName>logbackcontextName>
-
- <property name="log.path" value="F:/java基础学习/复习testcode/logs" />
-
- <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
-
-
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>debuglevel>
- filter>
- <encoder>
- <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
-
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
-
-
- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
-
- <file>${log.path}/log_debug.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd_HH-mm}.%i.logfileNamePattern>
-
-
- <maxFileSize>100MBmaxFileSize>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>debuglevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/log_info.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
-
-
- <maxFileSize>100MBmaxFileSize>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
- rollingPolicy>
-
-
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>infolevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
- <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/log_warn.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
-
-
- <maxFileSize>100MBmaxFileSize>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>warnlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
-
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <file>${log.path}/log_error.logfile>
-
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
- <charset>UTF-8charset>
- encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-
-
-
- <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
-
-
- <maxFileSize>100MBmaxFileSize>
-
- <maxHistory>30maxHistory>
-
- <totalSizeCap>20GBtotalSizeCap>
- rollingPolicy>
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERRORlevel>
- <onMatch>ACCEPTonMatch>
- <onMismatch>DENYonMismatch>
- filter>
- appender>
-
-
-
-
-
-
- <root level="INFO">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="DEBUG_FILE" />
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="WARN_FILE" />
- <appender-ref ref="ERROR_FILE" />
- root>
-
-
-
-
- <logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="debug" additivity="false">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="INFO_FILE" />
- logger>
-
-
-
-
-
-
-
- configuration>
- "1.0" encoding="UTF-8"?>
-
- <included>
-
- <conversionRule conversionWord="hostName" converterClass="com/limai/common/config/LogHostNameConfig.java" />
-
- <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="logs"/>
- <springProperty scope="context" name="contextName" source="spring.application.name" defaultValue="defaultapp"/>
-
- <springProperty scope="context" name="maxFileSize" source="logging.maxFileSize" defaultValue="1GB"/>
-
- <springProperty scope="context" name="maxHistory" source="logging.maxHistory" defaultValue="30"/>
-
- <springProperty scope="context" name="totalSizeCap" source="logging.totalSizeCap" defaultValue="50GB"/>
- <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="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
-
- <property name="CONSOLE_LOG_2"
- 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} %clr(ip:[%X{ip}]){faint} %clr(traceId:[%X{traceId}]){faint} %dSm %n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
- <appender name="TEMPFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${LOG_PATH}/${contextName}/temp-${hostName}.logfile>
- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
- <fileNamePattern>${LOG_PATH}/${contextName}/temp-${hostName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
- <maxFileSize>${maxFileSize}maxFileSize>
- <maxHistory>5maxHistory>
- <totalSizeCap>1GBtotalSizeCap>
- rollingPolicy>
- <append>trueappend>
- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
- <providers>
-
- <pattern>
- <pattern>
- {
- "timestamp": "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSXXX\", Asia/Shanghai}",
- "app": "${contextName}",
- "version": "${version}",
- "app_host": "${hostName}",
-
- "level": "%level",
-
- "pid": "${PID:-}",
- "thread": "%thread",
- "class": "%logger",
- "method": "%method",
- "line": "%line",
- "request_ip":"%mdc{ip}",
- "traceId":"%mdc{traceId}",
- "client_info":"%mdc{client_info}",
- "action":"",
- "user_info":"#tryJson{%mdc{user_info}}",
-
- "msg": "%dSm",
-
- "statck_trace":"%xEx"
- }
- pattern>
- pattern>
- providers>
- encoder>
- appender>
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <withJansi>truewithJansi>
- <encoder>
- <pattern>${CONSOLE_LOG_2}pattern>
- encoder>
- appender>
-
-
- <logger name="io" level="WARN"/>
- <logger name="com" level="INFO"/>
- <logger name="de" level="WARN"/>
- <logger name="org" level="WARN"/>
- <logger name="net" level="WARN"/>
- <logger name="sun" level="WARN"/>
- <logger name="javax" level="WARN"/>
- <logger name="jdbc" level="ERROR"/>
- <logger name="liquibase" level="WARN"/>
- <logger name="reactor" level="WARN"/>
- <logger name="springfox" level="WARN"/>
-
- <logger name="ch.qos.logback" level="ERROR"/>
- <logger name="org.springframework" level="INFO"/>
- <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
- <logger name="jdbc.resultsettable" level="INFO"/>
- <logger name="jdbc.sqlonly" level="INFO"/>
- <springProfile name="prod,release">
- <root level="INFO">
- <appender-ref ref="TEMPFILE"/>
- root>
- springProfile>
-
- <springProfile name="test,dev,local">
- <root level="INFO">
- <appender-ref ref="TEMPFILE"/>
- <appender-ref ref="CONSOLE"/>
- root>
- springProfile>
-
-
- <springProfile name="local">
- <root level="DEBUG">
- <appender-ref ref="CONSOLE"/>
- root>
- springProfile>
- included>
比较详细的输出配置:
- <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} %clr(ip:[%X{ip}]){faint} %clr(traceId:[%X{traceId}]){faint} %dSm %n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint}:这是一个控制台日志输出格式的设置。${CONSOLE_LOG_PATTERN} 是一个环境变量,表示如果环境变量没有设置,就使用默认的格式。这个默认格式包含了输出日志的时间,并使用了faint颜色,使得时间显示的更加淡化。value="${CONSOLE_LOG_PATTERN:-...}":这里使用了属性占位符,表示如果在运行时没有设置CONSOLE_LOG_PATTERN属性,就使用后面冒号后面的默认值。
%clr(${LOG_LEVEL_PATTERN:-%5p}):这是日志级别的设置,如果环境变量 ${LOG_LEVEL_PATTERN} 没有设置,就使用默认的格式 %5p,表示左对齐并且占据5个字符的空间,显示日志级别。
%clr(${PID:- }){magenta}:这个占位符用于显示进程ID,如果环境变量 ${PID} 没有设置,则显示一个空格。并且使用 magenta 颜色显示进程ID。
%clr(---){faint}:这个是用于简单分隔的符号 ---,使用 faint 颜色显示。
%clr([%15.15t]){faint}:这个占位符用于显示线程名称,最多显示15个字符,使用 faint 颜色。
%clr(%-40.40logger{39}){cyan}:这个占位符用于显示logger名称,最多显示40个字符,使用 cyan 颜色。
%clr(ip:[%X{ip}]){faint}:这个占位符用于显示额外的信息,如 IP 地址,使用 faint 颜色。
%clr(traceId:[%X{traceId}]){faint}:这个占位符用于显示额外的信息,如 Trace ID,使用 faint 颜色。
%msg:日志内容。
%n:换行符。
${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}:这是用于处理异常信息的占位符,如果环境变量 ${LOG_EXCEPTION_CONVERSION_WORD} 没有设置,就使用默认的 %wEx 格式来输出异常信息。
综合起来,这个格式定义了一个非常详细的日志输出格式,包括时间、日志级别、进程ID、线程名称、Logger 名称、额外信息(如 IP 地址和 Trace ID)、时间戳、换行符以及异常信息。并且使用了颜色控制符来美化输出。