1. 配置结构

整个logback.xml配置文件的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- springProperty: 读取Spring主配置文件:logging.file.path的值 -->
<springProperty scope="context" name="logPath" source="logging.file.path"/>
<!-- property: 用来定义变量值的标签-->
<property name="param.name" value="param.value" />

<!--contextName:关联到logger上下文名称,默认上下文名称为“default”。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录 -->
<!-- ${param.name}:变量的使用 -->
<contextName>${param.name}</contextName>

<!-- 负责写日志的组件 -->
<appender name="appenderNameDemo" class="appender种类" >
...
<!-- appender子标签:它作为过滤器存在 -->
<filter></filter>

<!-- appender子标签: 指定被写入的文件名 -->
<file></file>

<!-- appender子标签: 用来描述滚动策略 -->
<rollingPolicy>
<!-- rollingPolicy子标签: 指定保存滚动文件的的位置 -->
<fileNamePattern></fileNamePattern>
<!-- rollingPolicy子标签: 指定单日志文件的最大值 -->
<maxFileSize></maxFileSize>
<!-- rollingPolicy子标签: 最多保留前几天历史记录 -->
<maxHistory>具体天数</maxHistory>
<!-- rollingPolicy子标签: 在有 maxHistory 的限制下,进一步限制所有日志文件大小之和的上限,超过则从最旧的日志开始删除 -->
<totalSizeCap></maxHistory>
</rollingPolicy>

<!-- appender子标签: 对记录事件进行格式化 -->
<encoder>
<!-- encoder子标签: 日志输出格式,可自定义 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- encoder子标签: 指定编码 -->
<charset>UTF-8</charset>
</encoder>
</appender>

<!--异步日志配置-->
<appender name="异步日志配置" class="ch.qos.logback.classic.AsyncAppender">
<!-- 异步日志中配置属性:如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,默认是0 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>0</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="appenderNameDemo"/>
</appender>

<!-- 用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender -->
<logger>
...
</logger>
<!-- 根logger,也是一种logger,且只有一个level属性 -->
<root level="日志级别">
...
</root>
</configuration>

2. 属性说明

2.1 configuration

configuration标签中有: scanscanPerioddebug三个属性,属性含义如下:

  • scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
  • scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scantrue时,此属性生效。默认的时间间隔为1分钟。
  • debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

使用示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
...
</configuration>

2.2 springProperty

获取 SpringBoot中的配置信息,

使用示例:

修改配置文件: src/main/resources/application.properties

## 设置日志文件路径
logging.file.path=./logs

src/main/resources/logback-spring.xml使用:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="300 seconds">
<!-- 读取SpringBoot中的配置信息-->
<springProperty scope="context" name="logPath" source="logging.file.path"/>
...
</configuration>

2.3 contextName

每个logger都关联到logger上下文,默认上下文名称为default。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录。

使用示例:

src/main/resources/logback-spring.xml使用:

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="300 seconds">
<!-- 设置contextName标签,用于区分不同应用程序的记录-->
<contextName>log-demo-contextName</contextName>
<!--日志输出器-->
<appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 配置日志输出格式,%contextName输出contextName标签 -->
<pattern>%date -[%contextName] %-5level-[%thread] %class.%method|%line : %msg%n</pattern>
</encoder>
</appender>
<!-- 根记录器 -->
<root level="info">
<!--输出记录的日志-->
<appender-ref ref="CONSOLE-LOG"/>
</root>
</configuration>

image-20201028221702491

2.4 property

用来定义变量值的标签,通过property定义的值会被插入到logger上下文中。

property标签中有: namevalue 两个个属性,属性含义如下:

  • name的值是变量的名称
  • value的值时变量定义的值

定义变量后,可以使${name}来使用变量。

使用示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- property: 用来定义变量值的标签-->
<property name="param.name" value="param.value" />
<!-- ${param.name}:变量的使用 -->
<contextName>${param.name}</contextName>
...
</configuration>

2.5 logger

用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender,这样就可以控制非业务日志不写到对应的文件日志中。

logger标签中有: nameleveladditivity三个属性,属性含义如下:

  • name: 包的路径信息,比如只打印TestController控制器:com.hui.logdemo.controller.LogController或者包(com.hui.logdem)的日志。
  • level: 日志的级别,指打印某级别或更高级别的日志。
  • additivity: 是否向上级logger传递打印信息,默认为true

使用示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan :开启"热更新" scanPeriod:"热更新"扫描周期,默认 60 seconds(60秒)-->
<configuration scan="true" scanPeriod="300 seconds">
<!--日志输出器-->
<appender name="INFO_LOG" class="ch.qos.logback.core.FileAppender">
<file>logs/info.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 配置日志输出格式,%contextName输出contextName标签 -->
<pattern>%date %-5level-[%thread] %class.%method|%line : %msg%n</pattern>
<!-- 使用的字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 只打印包com.hui.logdemo下的日志,最低级别从info开始-->
<logger name="com.hui.logdemo" level="info" additivity="false">
<!-- 使用INFO_LOG的<appender>进行日志输出-->
<appender-ref ref="INFO_LOG"/>
</logger>
</configuration>

2.6 root

logger,也是一种logger,且只有一个level属性。使用案例参考: 2.3 contextName

root和logger的区别?

root和根logger其实是一回事;只不过root中不能有nameadditivity这两个属性。

2.7 appender

负责写日志的组件,内容比较繁杂放到Logback配置文件详解(下篇)单独讲。