• java日志框架总结(六、logback日志框架 扩展)


    springboot推荐使用logback-spring.xml而不是logback.xml
    而logback-spring.xml文件与logback.xml文件还是有一定的区别,所以简单讲解一下。

     一、logback-spring.xml

    配置文件实例:

    1. "1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="10 seconds">
    3. <contextName>logbackcontextName>
    4. <springProperty scope="context" name="myLogLocation" source="logging.file-location" default="/var/log/myapp"/>
    5. <property name="log.path" value="${myLogLocation}"/>
    6. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    7. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    8. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    9. <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}}"/>
    10. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    11. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    12. <level>debuglevel>
    13. filter>
    14. <encoder>
    15. <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
    16. <charset>UTF-8charset>
    17. encoder>
    18. appender>
    19. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    20. <file>${log.path}/debug.logfile>
    21. <encoder>
    22. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    23. <charset>UTF-8charset>
    24. encoder>
    25. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    26. <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    27. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    28. <maxFileSize>100MBmaxFileSize>
    29. timeBasedFileNamingAndTriggeringPolicy>
    30. <maxHistory>15maxHistory>
    31. rollingPolicy>
    32. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    33. <level>debuglevel>
    34. <onMatch>ACCEPTonMatch>
    35. <onMismatch>DENYonMismatch>
    36. filter>
    37. appender>
    38. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    39. <file>${log.path}/info.logfile>
    40. <encoder>
    41. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    42. <charset>UTF-8charset>
    43. encoder>
    44. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    45. <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    46. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    47. <maxFileSize>100MBmaxFileSize>
    48. timeBasedFileNamingAndTriggeringPolicy>
    49. <maxHistory>15maxHistory>
    50. rollingPolicy>
    51. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    52. <level>infolevel>
    53. <onMatch>ACCEPTonMatch>
    54. <onMismatch>DENYonMismatch>
    55. filter>
    56. appender>
    57. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    58. <file>${log.path}/warn.logfile>
    59. <encoder>
    60. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    61. <charset>UTF-8charset>
    62. encoder>
    63. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    64. <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    65. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    66. <maxFileSize>100MBmaxFileSize>
    67. timeBasedFileNamingAndTriggeringPolicy>
    68. <maxHistory>15maxHistory>
    69. rollingPolicy>
    70. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    71. <level>warnlevel>
    72. <onMatch>ACCEPTonMatch>
    73. <onMismatch>DENYonMismatch>
    74. filter>
    75. appender>
    76. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    77. <file>${log.path}/error.logfile>
    78. <encoder>
    79. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    80. <charset>UTF-8charset>
    81. encoder>
    82. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    83. <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    84. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    85. <maxFileSize>100MBmaxFileSize>
    86. timeBasedFileNamingAndTriggeringPolicy>
    87. <maxHistory>15maxHistory>
    88. rollingPolicy>
    89. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    90. <level>ERRORlevel>
    91. <onMatch>ACCEPTonMatch>
    92. <onMismatch>DENYonMismatch>
    93. filter>
    94. appender>
    95. <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    96. <file>${log.path}/all.logfile>
    97. <encoder>
    98. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    99. <charset>UTF-8charset>
    100. encoder>
    101. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    102. <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    103. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    104. <maxFileSize>100MBmaxFileSize>
    105. timeBasedFileNamingAndTriggeringPolicy>
    106. <maxHistory>15maxHistory>
    107. rollingPolicy>
    108. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    109. <level>DEBUGlevel>
    110. <onMatch>DENYonMatch>
    111. <onMismatch>ACCEPTonMismatch>
    112. filter>
    113. appender>
    114. <springProfile name="dev">
    115. <root level="info">
    116. <appender-ref ref="CONSOLE" />
    117. <appender-ref ref="DEBUG_FILE" />
    118. <appender-ref ref="INFO_FILE" />
    119. <appender-ref ref="WARN_FILE" />
    120. <appender-ref ref="ERROR_FILE" />
    121. <appender-ref ref="ALL_FILE" />
    122. root>
    123. <logger name="com.xusanduo.demo" level="debug"/>
    124. springProfile>
    125. <springProfile name="test">
    126. <root level="info">
    127. <appender-ref ref="CONSOLE" />
    128. <appender-ref ref="DEBUG_FILE" />
    129. <appender-ref ref="INFO_FILE" />
    130. <appender-ref ref="WARN_FILE" />
    131. <appender-ref ref="ERROR_FILE" />
    132. <appender-ref ref="ALL_FILE" />
    133. root>
    134. <logger name="com.xusanduo.demo" level="info"/>
    135. springProfile>
    136. <springProfile name="pro">
    137. <root level="info">
    138. <appender-ref ref="DEBUG_FILE" />
    139. <appender-ref ref="INFO_FILE" />
    140. <appender-ref ref="WARN_FILE" />
    141. <appender-ref ref="ERROR_FILE" />
    142. <appender-ref ref="ALL_FILE" />
    143. root>
    144. <logger name="com.xusanduo.demo" level="warn"/>
    145. <logger name="com.xusanduo.demo.MyApplication" level="info"/>
    146. springProfile>
    147. configuration>

       大部分标签都比较类似,简单说一下:
       

    一、logback-spring.xml的配置项

    共有一个父标签、两种属性、三个节点: (与logback.xml类似)

      一个父标签:configuration
      两种属性:contextName和property
      三个节点:appender、root、logger

     1、父标签configuration:
    • scan

    当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true

    • scanPeriod

    设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。

    • debug

    当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

    1. <configuration scan="true" scanPeriod="10 seconds">
    2. configuration>

     2、两种属性 contextName和property
    1)contextName

    每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
    如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。如果这两个配置文件的contextName不同,就会报错:

    1. # logback.xml
    2. "1.0" encoding="UTF-8"?>
    3. <configuration scan="true" scanPeriod="60 seconds" debug="false">
    4. <contextName>logbackcontextName>
    5. configuration>
    6. 12345
    1. # logback-spring,xml
    2. "1.0" encoding="UTF-8"?>
    3. <configuration scan="false" scanPeriod="60 seconds" debug="false">
    4. <contextName>logback_democontextName>
    5. configuration>
    6. 12345
    1. # application.properties
    2. logging.config=classpath:logback-spring.xml
    3. 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

    2)  property 

        用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
    例如使用定义上下文名称,然后在设置logger上下文时使用。

    1. <configuration scan="true" scanPeriod="60 seconds" debug="false">
    2. <property name="APP_Name" value="myAppName" />
    3. <contextName>${APP_Name}contextName>
    4. configuration>

    就相当于自定义一个全局变量!

    3、springProperty 

    1.该 标签允许我们从Spring中显示属性,Environment 以便在Logback中使用。如果你想将 application.properties在回读配置中访问文件中的值,这将非常有用

    2.标签的工作方式与Logback的标准 标签类似,但不是直接value 指定source属性(从Environment)指定。scope 如果需要将属性存储在local范围之外的其他位置,则可以使用该属性。如果您需要一个后备值,以防该属性未设置,则Environment可以使用该defaultValue属性。

     意思就是可以读取properties配置文件中的属性。读取示例如下:
     

    1.yml配置

    logging:
        name: app

    2.xml配置
    使用springProperty标签读取yml配置


    标签配置解读:

    scope  作用区域:context全局 

    name 变量名

    source 资源值(yml对应资源)

    defaultValue 默认值

    3.使用

    直接使用${变量名}

     4、conversionRule

            定义转换器,可以用来对日志进行特殊的转换,比如,SpringBoot后启动项目控制台会带有彩色日志样式,是因为使用了org.springframework.boot.logging.logback.ColorConverter颜色转换器,会把日志用AnsiOutput进行输出。就是可以用来进行彩色日志转换。

    1. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    2. <conversionRule conversionWord="wex"
    3. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    4. <conversionRule conversionWord="wEx"
    5. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    6. <property name="CONSOLE_LOG_PATTERN"
    7. 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}}"/>

    5、三个节点 appender、root、logger
    appender:

    appender 使用元素配置,该元素采用两个必需属性 name 和 class。

    •         name 属性指定 appender 的名称
    •         class 属性指定要实例化的 appender 类的完全限定名称。

    元素可以包含零个或一个元素,零个或多个元素以及零个或多个元素。

    下图说明了常见的结构:

    重要:在 logback 中,输出目标称为 appender,addAppender 方法将 appender 添加到给定的记录器 logger。
    给定记录器的每个启用的日志记录请求都将转发到该记录器中的所有 appender 以及层次结构中较高的 appender。 换句话说,appender 是从记录器层次结构中附加地继承的。

    例如,如果将控制台 appender 添加到根记录器,则所有启用的日志记录请求将至少在控制台上打印。

    如果另外将文件追加器添加到记录器(例如L),则对 L 和 L 的子项启用的记录请求将打印在文件和控制台上。
    通过将记录器的 additivity 标志设置为 false,可以覆盖此默认行为,以便不再添加 appender 累积。

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

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

    1)、ConsoleAppender

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

    2)、RollingFileAppender

    RollingFileAppender,是 FileAppender 的一个子类,扩展了 FileAppender,具有翻转日志文件的功能。

    例如,RollingFileAppender 可以记录到名为 log.txt 文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。

    有两个与 RollingFileAppender 交互的重要子组件。

    • RollingPolicy:负责执行翻转所需的操作。
    • TriggeringPolicy:将确定是否以及何时发生翻转。

    因此,RollingPolicy 负责什么和 TriggeringPolicy 负责什么时候。

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

    3)、滚动策略

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

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

     4)、encoder:

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

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

    输出格式

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

    通常encoder标签中只需要设置两个标签:

    1. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    2. <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.OnMarkerEvaluator

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

    LevelFilter 根据精确的级别匹配过滤事件。
    如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于 onMatch 和 onMismatch 属性的配置。

    例如下面配置将只打印 INFO 级别的日志,其余的全部禁止打印输出:

    1. <configuration>
    2. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    3. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    4. <level>INFOlevel>
    5. <onMatch>ACCEPTonMatch>
    6. <onMismatch>DENYonMismatch>
    7. filter>
    8. <encoder>
    9. <pattern>
    10. %-4relative [%thread] %-5level %logger{30} - %msg%n
    11. pattern>
    12. encoder>
    13. appender>
    14. <root level="DEBUG">
    15. <appender-ref ref="CONSOLE" />
    16. root>
    17. configuration>

    ThresholdFilter 过滤低于指定阈值的事件。
    对于等于或高于阈值的事件,ThresholdFilter 将在调用其 decision方法时响应 NEUTRAL。

    但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于 INFO 级别的日志,只输出 INFO 以及以上级别的日志:

    1. <configuration>
    2. <appender name="CONSOLE"
    3. class="ch.qos.logback.core.ConsoleAppender">
    4. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    5. <level>INFOlevel>
    6. filter>
    7. <encoder>
    8. <pattern>
    9. %-4relative [%thread] %-5level %logger{30} - %msg%n
    10. pattern>
    11. encoder>
    12. appender>
    13. <root level="DEBUG">
    14. <appender-ref ref="CONSOLE" />
    15. root>
    16. configuration>

    logger 和 root

    logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
    意思就是说,logger标签可以对某个类进行单独配置,而root是整体配置。

    举例说明:

    1)、logger

    对单个包或类添加配置:

    1. <logger name="com.pikaqiu.logbackdemo" level="debug" additivity="false">
    2. <appender-ref ref="CONSOLE" />
    3. logger>
    4. <logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO" additivity="true">
    5. <appender-ref ref="STDOUT"/>
    6. logger>
    • 用来设置某一个包或者具体的某一个类的日志打印级别、以及指定仅有一个name属性,一个可选的level和一个可选的addtivity属性。
    • name:用来指定受此logger约束的某一个包或者具体的某一个类。
    • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。
    • addtivity:是否向上级logger传递打印信息。默认是true。
    • 元素可以包含零个或多个元素。这样引用的每个 appender 都被添加到指定的 logger 中,logger 元素级别具有继承性。
    • root和logger是父子的关系,logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
    • 如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍!

            2)、root
    • root节点实际上是配置启用哪种appender,可以添加多个appender。
    • root配置必须在appender下边
    •  root节点是对所有appender的管理,添加哪个appender就会打印哪个appender的日志
    • root节点的level是总的日志级别控制,如果appender的日志级别设定比root的高,会按照appender的日志级别打印日志
    •  如果appender的日志级别比root的低,会按照root设定的日志级别进行打印日志
    • 也就是说root设定的日志级别是最低限制,如果root设定级别为最高ERROR,那么所有appender只能打印最高级别的日志
    1. <root level="DEBUG">
    2. <appender-ref ref="CONSOLE" />
    3. <appender-ref ref="DEBUG_FILE" />
    4. <appender-ref ref="INFO_FILE" />
    5. <appender-ref ref="WARN_FILE" />
    6. <appender-ref ref="ERROR_FILE" />
    7. root>

    6、springProfile
    • spring profile就是spring的多环境配置功能,可以通过执行激活的profile来进行配置环境的快速切换。
    • 最终的策略:基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)
    • 也就是说不同的环境指定不同的日志配置
    1. <springProfile name="dev">
    2. <root level="info">
    3. <appender-ref ref="CONSOLE" />
    4. <appender-ref ref="DEBUG_FILE" />
    5. <appender-ref ref="INFO_FILE" />
    6. <appender-ref ref="WARN_FILE" />
    7. <appender-ref ref="ERROR_FILE" />
    8. <appender-ref ref="ALL_FILE" />
    9. root>
    10. <logger name="com.shen.test" level="debug"/>
    11. springProfile>
    12. <springProfile name="test">
    13. <root level="info">
    14. <appender-ref ref="CONSOLE" />
    15. <appender-ref ref="DEBUG_FILE" />
    16. <appender-ref ref="INFO_FILE" />
    17. <appender-ref ref="WARN_FILE" />
    18. <appender-ref ref="ERROR_FILE" />
    19. <appender-ref ref="ALL_FILE" />
    20. root>
    21. <logger name="com.shen.test" level="info"/>
    22. springProfile>
    23. <springProfile name="pro">
    24. <root level="info">
    25. <appender-ref ref="DEBUG_FILE" />
    26. <appender-ref ref="INFO_FILE" />
    27. <appender-ref ref="WARN_FILE" />
    28. <appender-ref ref="ERROR_FILE" />
    29. <appender-ref ref="ALL_FILE" />
    30. root>
    31. <logger name="com.shen.test" level="warn"/>
    32. <logger name="com.shen.test.MyApplication" level="info"/>
    33. springProfile>

    7、included

        在微服务里使用了logback来对日志输出进行配置,由于配置文件里有很多通用的设置,所以有必要将通用的都提取到一个公共文件里,这样所有的微服务更改配置格式的话,只需更新通用文件即可,不用每个地方都改一遍了。

         如果一个logback.xml文件想在其他的项目中被引用,那么就需要用iucluded标签,将定义的appender跟logger包围起来,表示这个是可以被导入其他项目的。

    下面的是通用配置文件:logback-common.xml:

    1. "1.0" encoding="UTF-8" ?>
    2. <included>
    3. <appender name="${CONSOLE_APPENDER}" class="ch.qos.logback.core.ConsoleAppender">
    4. <layout class="ch.qos.logback.classic.PatternLayout">
    5. <pattern>
    6. [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
    7. pattern>
    8. layout>
    9. appender>
    10. <appender name="${FILE_INFO_APPENDER}" class="ch.qos.logback.core.rolling.RollingFileAppender">
    11. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    12. <level>INFOlevel>
    13. <onMatch>ACCEPTonMatch>
    14. <onMismatch>DENYonMismatch>
    15. filter>
    16. <encoder>
    17. <pattern>
    18. [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
    19. pattern>
    20. encoder>
    21. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    22. <fileNamePattern>${LOG_DIR}/${LOG_SERVICE_NAME}-info.%d.logfileNamePattern>
    23. <maxHistory>${LOG_HIS_MAX}maxHistory>
    24. <totalSizeCap>${LOG_TOTAL_SIZE}totalSizeCap>
    25. <cleanHistoryOnStart>truecleanHistoryOnStart>
    26. rollingPolicy>
    27. appender>
    28. <appender name="${FILE_ERROR_APPENDER}" class="ch.qos.logback.core.rolling.RollingFileAppender">
    29. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    30. <level>ERRORlevel>
    31. filter>
    32. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    33. <layout class="ch.qos.logback.classic.PatternLayout">
    34. <pattern>
    35. [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
    36. pattern>
    37. layout>
    38. encoder>
    39. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    40. <fileNamePattern>${LOG_DIR}/${LOG_SERVICE_NAME}-error.%d.logfileNamePattern>
    41. <maxHistory>${LOG_HIS_MAX}maxHistory>
    42. <totalSizeCap>${LOG_TOTAL_SIZE}totalSizeCap>
    43. <cleanHistoryOnStart>truecleanHistoryOnStart>
    44. rollingPolicy>
    45. appender>
    46. <springProfile name="dev">
    47. <root level="info">
    48. <appender-ref ref="${CONSOLE_APPENDER}"/>
    49. <appender-ref ref="${FILE_INFO_APPENDER}"/>
    50. <appender-ref ref="${FILE_ERROR_APPENDER}"/>
    51. root>
    52. springProfile>
    53. <springProfile name="uat">
    54. <root level="error">
    55. <appender-ref ref="${CONSOLE_APPENDER}"/>
    56. <appender-ref ref="${FILE_INFO_APPENDER}"/>
    57. <appender-ref ref="${FILE_ERROR_APPENDER}"/>
    58. root>
    59. springProfile>
    60. included>

    下面的是每个微服务自己的配置文件:logback-spring.xml:

    1. "1.0" encoding="UTF-8" ?>
    2. <configuration>
    3. <property scope="local" name="LOG_SERVICE_NAME" value="demo" />
    4. <property scope="local" name="LOG_DIR" value="/data/log" />
    5. <property scope="local" name="LOG_HIS_MAX" value="10" />
    6. <property scope="local" name="LOG_TOTAL_SIZE" value="2GB" />
    7. <property scope="local" name="CONSOLE_APPENDER" value="consoleLog" />
    8. <property scope="local" name="FILE_INFO_APPENDER" value="fileInfoLog" />
    9. <property scope="local" name="FILE_ERROR_APPENDER" value="fileErrorLog" />
    10. <include resource="logback-common.xml"/>
    11. configuration>

    在测试过程中出现了一个问题,就是控制台输出的日志时间是正常的,但在日志文件里输出的日志时间和实际时间相差了8个小时,判断是logback的配置文件还需要加上时区,如下:

    1. <pattern>
    2. [%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8}] %-5level [%t] [%c] - %msg%n
    3. pattern>

    在时间格式后面增加了 GMT+8,表示输出的日志时区设定为东8区,即北京时间。
    经过测试发现问题解决,文件里显示的也是实际时间了。

    配置文件 示例:

    1. "1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="60 seconds" debug="false">
    3. <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    4. <springProperty scope="context" name="APP_PORT" source="server.port"/>
    5. <conversionRule conversionWord="clr"
    6. converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    7. <conversionRule conversionWord="wex"
    8. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    9. <conversionRule conversionWord="wEx"
    10. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    11. <property name="CONSOLE_LOG_PATTERN"
    12. 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"/>
    13. <property name="FILE_LOG_PATTERN"
    14. value="%d{yyyy-MM-dd HH:mm:ss.SSS} [${APP_NAME:-APP}] %5p ${PID:- } [%15.15t] %-40.40logger{39} %-4line : %m%n%wEx"/>
    15. <property name="LOG_FILE" value="logs/log"/>
    16. <property name="ROLLINGPOLICY_FILE_NAME_PATTERN" value="${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz"/>
    17. <property name="ROLLINGPOLICY_MAX_FILE_SIZE" value="20MB"/>
    18. <property name="ROLLINGPOLICY_TOTAL_SIZE_CAP" value="1GB"/>
    19. <property name="ROLLINGPOLICY_CLEAN_HISTORY_ON_START" value="true"/>
    20. <property name="ROLLINGPOLICY_MAX_HISTORY" value="10"/>
    21. <appender name="CONSOLE_OUT" class="ch.qos.logback.core.ConsoleAppender">
    22. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    23. <pattern>${CONSOLE_LOG_PATTERN}pattern>
    24. <charset>UTF-8charset>
    25. encoder>
    26. appender>
    27. <appender name="FILE_OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
    28. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    29. <pattern>${FILE_LOG_PATTERN}pattern>
    30. <charset>UTF-8charset>
    31. encoder>
    32. <file>${LOG_FILE}file>
    33. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    34. <fileNamePattern>${ROLLINGPOLICY_FILE_NAME_PATTERN}fileNamePattern>
    35. <cleanHistoryOnStart>${ROLLINGPOLICY_CLEAN_HISTORY_ON_START}cleanHistoryOnStart>
    36. <maxFileSize>${ROLLINGPOLICY_MAX_FILE_SIZE}maxFileSize>
    37. <totalSizeCap>${ROLLINGPOLICY_TOTAL_SIZE_CAP}totalSizeCap>
    38. <maxHistory>${ROLLINGPOLICY_MAX_HISTORY}maxHistory>
    39. rollingPolicy>
    40. appender>
    41. <appender name="ASYNC_CONSOLE_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
    42. <discardingThreshold>0discardingThreshold>
    43. <queueSize>1024queueSize>
    44. <neverBlock>falseneverBlock>
    45. <includeCallerData>trueincludeCallerData>
    46. <appender-ref ref ="CONSOLE_OUT"/>
    47. appender>
    48. <appender name="ASYNC_FILE_APPENDER" class="ch.qos.logback.classic.AsyncAppender">
    49. <discardingThreshold>0discardingThreshold>
    50. <queueSize>1024queueSize>
    51. <neverBlock>falseneverBlock>
    52. <appender-ref ref ="FILE_OUT"/>
    53. appender>
    54. <root level="INFO">
    55. <appender-ref ref="ASYNC_CONSOLE_APPENDER"/>
    56. <appender-ref ref="ASYNC_FILE_APPENDER"/>
    57. root>
    58. configuration>
    1. "1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="10 seconds">
    3. <contextName>MyContextNamecontextName>
    4. <springProperty name="serverName" source="logging.file.name" defaultValue="MyServerName"/>
    5. <springProperty name="logging.path" source="logging.file.path" defaultValue="././logs/"/>
    6. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    7. <conversionRule conversionWord="wex"
    8. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    9. <conversionRule conversionWord="wEx"
    10. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    11. <property name="CONSOLE_LOG_PATTERN"
    12. 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}}"/>
    13. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    14. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    15. <level>debuglevel>
    16. filter>
    17. <encoder>
    18. <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
    19. <charset>UTF-8charset>
    20. encoder>
    21. appender>
    22. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    23. <file>${logging.path}/web_debug.logfile>
    24. <encoder>
    25. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    26. <charset>UTF-8charset>
    27. encoder>
    28. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    29. <fileNamePattern>${logging.path}/web-debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    30. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    31. <maxFileSize>100MBmaxFileSize>
    32. timeBasedFileNamingAndTriggeringPolicy>
    33. <maxHistory>15maxHistory>
    34. rollingPolicy>
    35. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    36. <level>debuglevel>
    37. <onMatch>ACCEPTonMatch>
    38. <onMismatch>DENYonMismatch>
    39. filter>
    40. appender>
    41. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    42. <file>${logging.path}/web_info.logfile>
    43. <encoder>
    44. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    45. <charset>UTF-8charset>
    46. encoder>
    47. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    48. <fileNamePattern>${logging.path}/web-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    49. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    50. <maxFileSize>100MBmaxFileSize>
    51. timeBasedFileNamingAndTriggeringPolicy>
    52. <maxHistory>15maxHistory>
    53. rollingPolicy>
    54. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    55. <level>infolevel>
    56. <onMatch>ACCEPTonMatch>
    57. <onMismatch>DENYonMismatch>
    58. filter>
    59. appender>
    60. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    61. <file>${logging.path}/web_warn.logfile>
    62. <encoder>
    63. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    64. <charset>UTF-8charset>
    65. encoder>
    66. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    67. <fileNamePattern>${logging.path}/web-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    68. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    69. <maxFileSize>100MBmaxFileSize>
    70. timeBasedFileNamingAndTriggeringPolicy>
    71. <maxHistory>15maxHistory>
    72. rollingPolicy>
    73. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    74. <level>warnlevel>
    75. <onMatch>ACCEPTonMatch>
    76. <onMismatch>DENYonMismatch>
    77. filter>
    78. appender>
    79. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    80. <file>${logging.path}/web_error.logfile>
    81. <encoder>
    82. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    83. <charset>UTF-8charset>
    84. encoder>
    85. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    86. <fileNamePattern>${logging.path}/web-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    87. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    88. <maxFileSize>100MBmaxFileSize>
    89. timeBasedFileNamingAndTriggeringPolicy>
    90. <maxHistory>15maxHistory>
    91. rollingPolicy>
    92. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    93. <level>ERRORlevel>
    94. <onMatch>ACCEPTonMatch>
    95. <onMismatch>DENYonMismatch>
    96. filter>
    97. appender>
    98. <springProfile name="dev">
    99. <logger name="com.myClass.controller" level="debug"/>
    100. springProfile>
    101. <root level="info">
    102. <appender-ref ref="CONSOLE"/>
    103. <appender-ref ref="DEBUG_FILE"/>
    104. <appender-ref ref="INFO_FILE"/>
    105. <appender-ref ref="WARN_FILE"/>
    106. <appender-ref ref="ERROR_FILE"/>
    107. root>
    108. configuration>
    1. "1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="10 seconds">
    3. <contextName>logback-testcontextName>
    4. <property name="log.path" value="/opt/test/log"/>
    5. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    6. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    7. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    8. <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}}"/>
    9. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    10. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    11. <level>debuglevel>
    12. filter>
    13. <encoder>
    14. <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
    15. <charset>UTF-8charset>
    16. encoder>
    17. appender>
    18. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    19. <file>${log.path}/debug.logfile>
    20. <encoder>
    21. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    22. <charset>UTF-8charset>
    23. encoder>
    24. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    25. <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    26. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    27. <maxFileSize>100MBmaxFileSize>
    28. timeBasedFileNamingAndTriggeringPolicy>
    29. <maxHistory>15maxHistory>
    30. <totalSizeCap>10GBtotalSizeCap>
    31. rollingPolicy>
    32. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    33. <level>debuglevel>
    34. <onMatch>ACCEPTonMatch>
    35. <onMismatch>DENYonMismatch>
    36. filter>
    37. appender>
    38. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    39. <file>${log.path}/info.logfile>
    40. <encoder>
    41. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    42. <charset>UTF-8charset>
    43. encoder>
    44. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    45. <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    46. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    47. <maxFileSize>100MBmaxFileSize>
    48. timeBasedFileNamingAndTriggeringPolicy>
    49. <maxHistory>15maxHistory>
    50. rollingPolicy>
    51. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    52. <level>infolevel>
    53. <onMatch>ACCEPTonMatch>
    54. <onMismatch>DENYonMismatch>
    55. filter>
    56. appender>
    57. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    58. <file>${log.path}/warn.logfile>
    59. <encoder>
    60. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    61. <charset>UTF-8charset>
    62. encoder>
    63. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    64. <fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    65. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    66. <maxFileSize>100MBmaxFileSize>
    67. timeBasedFileNamingAndTriggeringPolicy>
    68. <maxHistory>15maxHistory>
    69. rollingPolicy>
    70. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    71. <level>warnlevel>
    72. <onMatch>ACCEPTonMatch>
    73. <onMismatch>DENYonMismatch>
    74. filter>
    75. appender>
    76. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    77. <file>${log.path}/error.logfile>
    78. <encoder>
    79. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    80. <charset>UTF-8charset>
    81. encoder>
    82. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    83. <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    84. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    85. <maxFileSize>100MBmaxFileSize>
    86. timeBasedFileNamingAndTriggeringPolicy>
    87. <maxHistory>15maxHistory>
    88. rollingPolicy>
    89. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    90. <level>ERRORlevel>
    91. <onMatch>ACCEPTonMatch>
    92. <onMismatch>DENYonMismatch>
    93. filter>
    94. appender>
    95. <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    96. <file>${log.path}/all.logfile>
    97. <encoder>
    98. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    99. <charset>UTF-8charset>
    100. encoder>
    101. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    102. <fileNamePattern>${log.path}/all-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    103. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    104. <maxFileSize>100MBmaxFileSize>
    105. timeBasedFileNamingAndTriggeringPolicy>
    106. <maxHistory>15maxHistory>
    107. rollingPolicy>
    108. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    109. <level>DEBUGlevel>
    110. <onMatch>DENYonMatch>
    111. <onMismatch>ACCEPTonMismatch>
    112. filter>
    113. appender>
    114. <springProfile name="dev">
    115. <root level="info">
    116. <appender-ref ref="CONSOLE" />
    117. <appender-ref ref="DEBUG_FILE" />
    118. <appender-ref ref="INFO_FILE" />
    119. <appender-ref ref="WARN_FILE" />
    120. <appender-ref ref="ERROR_FILE" />
    121. <appender-ref ref="ALL_FILE" />
    122. root>
    123. <logger name="com.shen.test" level="debug"/>
    124. springProfile>
    125. <springProfile name="test">
    126. <root level="info">
    127. <appender-ref ref="CONSOLE" />
    128. <appender-ref ref="DEBUG_FILE" />
    129. <appender-ref ref="INFO_FILE" />
    130. <appender-ref ref="WARN_FILE" />
    131. <appender-ref ref="ERROR_FILE" />
    132. <appender-ref ref="ALL_FILE" />
    133. root>
    134. <logger name="com.shen.test" level="info"/>
    135. springProfile>
    136. <springProfile name="pro">
    137. <root level="info">
    138. <appender-ref ref="DEBUG_FILE" />
    139. <appender-ref ref="INFO_FILE" />
    140. <appender-ref ref="WARN_FILE" />
    141. <appender-ref ref="ERROR_FILE" />
    142. <appender-ref ref="ALL_FILE" />
    143. root>
    144. <logger name="com.shen.test" level="warn"/>
    145. <logger name="com.shen.test.MyApplication" level="info"/>
    146. springProfile>
    147. configuration>
    1. "1.0" encoding="UTF-8"?>
    2. <configuration debug="true">
    3. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    4. <encoder>
    5. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%npattern>
    6. <charset>UTF-8charset>
    7. encoder>
    8. appender>
    9. <appender name="info_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
    10. <File>logs/project_info.logFile>
    11. <append>trueappend>
    12. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    13. <level>ERRORlevel>
    14. <onMatch>DENYonMatch>
    15. <onMismatch>ACCEPTonMismatch>
    16. filter>
    17. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    18. <fileNamePattern>logs/project_info.%d.%i.logfileNamePattern>
    19. <maxHistory>30maxHistory>
    20. <totalSizeCap>20GBtotalSizeCap>
    21. <maxFileSize>10MBmaxFileSize>
    22. rollingPolicy>
    23. <encoder>
    24. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%npattern>
    25. <charset>UTF-8charset>
    26. encoder>
    27. appender>
    28. <appender name="error_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
    29. <File>logs/project_error.logFile>
    30. <append>trueappend>
    31. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    32. <level>ERRORlevel>
    33. filter>
    34. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    35. <fileNamePattern>logs/project_error.%d.%i.logfileNamePattern>
    36. <maxHistory>30maxHistory>
    37. <totalSizeCap>20GBtotalSizeCap>
    38. <maxFileSize>10MBmaxFileSize>
    39. rollingPolicy>
    40. <encoder>
    41. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%npattern>
    42. <charset>UTF-8charset>
    43. encoder>
    44. appender>
    45. <root level="INFO">
    46. <appender-ref ref="STDOUT" />
    47. root>
    48. <logger name="com.sailing.springbootmybatis" level="INFO">
    49. <appender-ref ref="info_log" />
    50. <appender-ref ref="error_log" />
    51. logger>
    52. <logger name="com.sailing.springbootmybatis.mapper" level="DEBUG" additivity="false">
    53. <appender-ref ref="info_log" />
    54. <appender-ref ref="error_log" />
    55. logger>
    56. <logger name="com.atomikos" level="INFO" additivity="false">
    57. <appender-ref ref="info_log" />
    58. <appender-ref ref="error_log" />
    59. logger>
    60. configuration>
    1. "1.0" encoding="UTF-8"?>
    2. <configuration scan="true" scanPeriod="10 seconds">
    3. <contextName>logbackcontextName>
    4. <property name="log.path" value="F:/java基础学习/复习testcode/logs" />
    5. <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
    6. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    7. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    8. <level>debuglevel>
    9. filter>
    10. <encoder>
    11. <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
    12. <charset>UTF-8charset>
    13. encoder>
    14. appender>
    15. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    16. <file>${log.path}/log_debug.logfile>
    17. <encoder>
    18. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    19. <charset>UTF-8charset>
    20. encoder>
    21. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    22. <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd_HH-mm}.%i.logfileNamePattern>
    23. <maxFileSize>100MBmaxFileSize>
    24. <maxHistory>30maxHistory>
    25. <totalSizeCap>20GBtotalSizeCap>
    26. rollingPolicy>
    27. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    28. <level>debuglevel>
    29. <onMatch>ACCEPTonMatch>
    30. <onMismatch>DENYonMismatch>
    31. filter>
    32. appender>
    33. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    34. <file>${log.path}/log_info.logfile>
    35. <encoder>
    36. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    37. <charset>UTF-8charset>
    38. encoder>
    39. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    40. <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    41. <maxFileSize>100MBmaxFileSize>
    42. <maxHistory>30maxHistory>
    43. <totalSizeCap>20GBtotalSizeCap>
    44. rollingPolicy>
    45. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    46. <level>infolevel>
    47. <onMatch>ACCEPTonMatch>
    48. <onMismatch>DENYonMismatch>
    49. filter>
    50. appender>
    51. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    52. <file>${log.path}/log_warn.logfile>
    53. <encoder>
    54. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    55. <charset>UTF-8charset>
    56. encoder>
    57. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    58. <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    59. <maxFileSize>100MBmaxFileSize>
    60. <maxHistory>30maxHistory>
    61. <totalSizeCap>20GBtotalSizeCap>
    62. rollingPolicy>
    63. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    64. <level>warnlevel>
    65. <onMatch>ACCEPTonMatch>
    66. <onMismatch>DENYonMismatch>
    67. filter>
    68. appender>
    69. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    70. <file>${log.path}/log_error.logfile>
    71. <encoder>
    72. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
    73. <charset>UTF-8charset>
    74. encoder>
    75. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    76. <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    77. <maxFileSize>100MBmaxFileSize>
    78. <maxHistory>30maxHistory>
    79. <totalSizeCap>20GBtotalSizeCap>
    80. rollingPolicy>
    81. <filter class="ch.qos.logback.classic.filter.LevelFilter">
    82. <level>ERRORlevel>
    83. <onMatch>ACCEPTonMatch>
    84. <onMismatch>DENYonMismatch>
    85. filter>
    86. appender>
    87. <root level="INFO">
    88. <appender-ref ref="STDOUT" />
    89. <appender-ref ref="DEBUG_FILE" />
    90. <appender-ref ref="INFO_FILE" />
    91. <appender-ref ref="WARN_FILE" />
    92. <appender-ref ref="ERROR_FILE" />
    93. root>
    94. <logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="debug" additivity="false">
    95. <appender-ref ref="STDOUT" />
    96. <appender-ref ref="INFO_FILE" />
    97. logger>
    98. configuration>
    1. "1.0" encoding="UTF-8"?>
    2. <included>
    3. <conversionRule conversionWord="hostName" converterClass="com/limai/common/config/LogHostNameConfig.java" />
    4. <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="logs"/>
    5. <springProperty scope="context" name="contextName" source="spring.application.name" defaultValue="defaultapp"/>
    6. <springProperty scope="context" name="maxFileSize" source="logging.maxFileSize" defaultValue="1GB"/>
    7. <springProperty scope="context" name="maxHistory" source="logging.maxHistory" defaultValue="30"/>
    8. <springProperty scope="context" name="totalSizeCap" source="logging.totalSizeCap" defaultValue="50GB"/>
    9. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    10. <conversionRule conversionWord="wex"
    11. converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    12. <conversionRule conversionWord="wEx"
    13. converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    14. <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
    15. <property name="CONSOLE_LOG_2"
    16. 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}}"/>
    17. <appender name="TEMPFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    18. <file>${LOG_PATH}/${contextName}/temp-${hostName}.logfile>
    19. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    20. <fileNamePattern>${LOG_PATH}/${contextName}/temp-${hostName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
    21. <maxFileSize>${maxFileSize}maxFileSize>
    22. <maxHistory>5maxHistory>
    23. <totalSizeCap>1GBtotalSizeCap>
    24. rollingPolicy>
    25. <append>trueappend>
    26. <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
    27. <providers>
    28. <pattern>
    29. <pattern>
    30. {
    31. "timestamp": "%date{\"yyyy-MM-dd'T'HH:mm:ss,SSSXXX\", Asia/Shanghai}",
    32. "app": "${contextName}",
    33. "version": "${version}",
    34. "app_host": "${hostName}",
    35. "level": "%level",
    36. "pid": "${PID:-}",
    37. "thread": "%thread",
    38. "class": "%logger",
    39. "method": "%method",
    40. "line": "%line",
    41. "request_ip":"%mdc{ip}",
    42. "traceId":"%mdc{traceId}",
    43. "client_info":"%mdc{client_info}",
    44. "action":"",
    45. "user_info":"#tryJson{%mdc{user_info}}",
    46. "msg": "%dSm",
    47. "statck_trace":"%xEx"
    48. }
    49. pattern>
    50. pattern>
    51. providers>
    52. encoder>
    53. appender>
    54. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    55. <withJansi>truewithJansi>
    56. <encoder>
    57. <pattern>${CONSOLE_LOG_2}pattern>
    58. encoder>
    59. appender>
    60. <logger name="io" level="WARN"/>
    61. <logger name="com" level="INFO"/>
    62. <logger name="de" level="WARN"/>
    63. <logger name="org" level="WARN"/>
    64. <logger name="net" level="WARN"/>
    65. <logger name="sun" level="WARN"/>
    66. <logger name="javax" level="WARN"/>
    67. <logger name="jdbc" level="ERROR"/>
    68. <logger name="liquibase" level="WARN"/>
    69. <logger name="reactor" level="WARN"/>
    70. <logger name="springfox" level="WARN"/>
    71. <logger name="ch.qos.logback" level="ERROR"/>
    72. <logger name="org.springframework" level="INFO"/>
    73. <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/>
    74. <logger name="jdbc.resultsettable" level="INFO"/>
    75. <logger name="jdbc.sqlonly" level="INFO"/>
    76. <springProfile name="prod,release">
    77. <root level="INFO">
    78. <appender-ref ref="TEMPFILE"/>
    79. root>
    80. springProfile>
    81. <springProfile name="test,dev,local">
    82. <root level="INFO">
    83. <appender-ref ref="TEMPFILE"/>
    84. <appender-ref ref="CONSOLE"/>
    85. root>
    86. springProfile>
    87. <springProfile name="local">
    88. <root level="DEBUG">
    89. <appender-ref ref="CONSOLE"/>
    90. root>
    91. springProfile>
    92. included>

    比较详细的输出配置:
     

    1. <property name="CONSOLE_LOG_PATTERN"
    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}}"/>
    • ${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)、时间戳、换行符以及异常信息。并且使用了颜色控制符来美化输出。

  • 相关阅读:
    AI低代码维格云甘特视图怎么用?
    【解决服务器重启后,Kubernetes无法启动的问题】
    10道不得不会的 Java容器 面试题
    IntelliJ IDEA 2022.2来了:已完全支持 Spring 6 和 Spring Boot 3
    链表---OJ题
    二叉树概述
    红酒煮水果可以吗?
    Word中设置粘贴为纯文本的自定义快捷键
    static关键字的一些注意点
    关于Springboot的@Profile的写法以及多个profile的写法排坑(“!profile1 && !profile2“ 的写法)
  • 原文地址:https://blog.csdn.net/kkkkatoq/article/details/136071005