基于SpringBoot Logback基础介绍

一. 配置入口

1.1 logback入口

Logback支持XML、Groovy的配置方式,以XML来说,它会默认查找resources目录下的logback-test.xml(用于测试)/logback.xml文件。

1.2 springboot 入口

使用logback-spring.xml文件进行配置
logback-spring.xml是由 Spring Boot 找到,插入自己的上下文信息,进一步处理后传递给Logback的.

  <springProfile> Env </springProfile> -- 区分环境
  <springProperty scope="context" name="APP_NAME" 
        source="spring.application.name"/> -- 获取spring上下文信息

二. logback-spring 配置简介

2.1 configuration

最外层的父标签,其中有几个属性配置(如: debug = true ) .但项目中较少使用.

2.2 property、springProperty、define

定义变量.

property 变量值通常为 常量、 xml上下文定义的变量 和Logback内建支持的上下文变量。(https://logback.qos.ch/manual/configuration.html#variableSubstitution

springProperty 变量值可以拿到Spring上下文属性。定义后,可以供property使用。

<define> 可以通过代码返回 变量值

<define name="ip" class="com.test.IPLogPropertyDefiner" />

public class IPLogPropertyDefiner extends PropertyDefinerBase {
   public IPLogPropertyDefiner() {
   }

   public String getPropertyValue() {
       return ServerConstants.SERVER_IP_ADDRESS;
   }
}

2.3 appender

定义日志输出到哪里,一般是写到文件。
logback提供了多种Appender. 常用两种:

  1. ch.qos.logback.core.rolling.RollingFileAppender负责将日志滚动打印
  2. ch.qos.logback.classic.AsyncAppender负责将日志异步打印,避免大量打印日志时阻塞线程。
    详细介绍看官方文档:https://logback.qos.ch/manual/appenders.html
 <property name="pattern"
              value="%d{HH:mm:ss.SSS} [%boldYellow(%-15.15thread)] [%X{MDC_LOG_ID}] %highlight(%-5level) %boldGreen(%-40.40logger{39})  - %msg %n"/>
<appender name="rolllingByDay" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxHistory>30</maxHistory>
        <maxFileSize>200MB</maxFileSize>
        <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>256</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <neverBlock>true</neverBlock>
    <appender-ref ref="rolllingByDay"/>
</appender>

2.4 logger 和 root

针对上一章中 某个Logger或者某个Logger集合 ,设置日志级别。
root 是所有Logger的默认设置。

<logger level="INFO" additivity="false" name="com.qb.user.UserDemo">
    <appender-ref ref="rolllingByDay"/>
</logger>
<root level="INFO">
    <appender-ref ref="async"/>
</root>

name支持最长前缀匹配原则。
如 假设我们定义了三个 logger com.qb.user.UserDemo,com.qb.user,com.qb. 对于
name = com.qb.user.UserDemo 的Logger实例,优先匹配到com.qb.user.UserDemo。

additivity属性最好设置为false. 如果为true。 对于上位的com.qb.user.UserDemoLogger实例,其日志可能打印三份。

2.5 springProfile

用于支持不用环境使用不用日志级别。 如 日常测试DEBUG,预发和线上使用INFO级别。

 <springProfile name="daily">
        <root level="DEBUG">
            <appender-ref ref="async"/>
        </root>
   </springProfile>
 <springProfile name="pre,prod">
        <root level="INFO">
            <appender-ref ref="async"/>
        </root>
   </springProfile>

三. 占位符

上文2.3章节中,我们通过 {pattern} 属性定义日志内容格式,其中用到了多种占位符。
详细可参考 https://logback.qos.ch/manual/layouts.html#conversionWord 。下文介绍常用的占位符。

%logger:   定义Logger实例name 
简写:c/ lo

%message:输出你实际要打印的日志信息
简写: %msg

%exception:输出异常堆栈,对应通过Slf4j传入的异常
简写%ex

%level:输出日志级别

%marker:输出通过Marker

%mdc:输出MDC
用法:mdc{key:-defaultVal} 等价 X{key:-defaultVal}

%date: 输出时间

%thread:线程

%n:换行

3.1. 输出长度

%占位符{length}:指定输出长度。
当实际长度小于指定长度,输出时,包名从最高级开始缩小到首字母,直到小于等于指定长度,最后一级不会缩短。
[%logger{0}]:只保留最后一级,且不会被缩短

3.2. 格式修饰

% 和占位符中间,还有一个用于控制格式的可选配置,正负数字+点+正负数字。
第一个数字表示:最小输出长度。
第二个数字表示:最大输出长度。
第一个数字前的正负表示:实际长度小于最小长度时,左空格补齐或右空格补齐。默认正——左侧填充空格,即右对齐。
第二个数字前的正负表示:实际长度大于最大输出长度时,左或右先裁剪。默认正——先左裁剪,右保留。举例:

[%-5,-10logger]:com.foo.bar.Service-->[com.foo.ba],最大10个字符,优先保留左侧字符
[%-5,10logger]:  com.foo.bar.Service--> [ar.Service],最大10个字符,优先保留右侧字符

四、MDC 中的 traceId
代码:

String traceId = IdUtil.fastSimpleUUID();
MDC.put(MDC_TRACE_ID, traceId);

日志:

[%X{MDC_LOG_ID}]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容