Logback-学习笔记

gs_huang

maven 依赖

springboot 项目中已经集成了 Logback 依赖。

对于非 springboot 项目中,需要引入如下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>

基本使用

如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package cn.itsheng.logbacktest.test1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestLogback {

private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);

public static void login(String username, String password){
logger.info("用户 {} 登陆了系统", username);
logger.info("用户名-{}, 密码-{}", username, password);
}

public static void main(String[] args) {
TestLogback.login("itsheng", "123456");
}
}

getLogger 的参数可以是 全路径名(比如:cn.itsheng.logbacktest.test1.TestLogback),也可以是 Class 类型的对象。

每一个 {} 都对应一个后面的参数,个数不限。

输出:

1
2
09:40:00.288 [main] INFO cn.itsheng.logbacktest.test1.TestLogback - 用户 itsheng 登陆了系统
09:40:00.292 [main] INFO cn.itsheng.logbacktest.test1.TestLogback - 用户名-itsheng, 密码-123456

配置 logback

logback 初始化配置:

  1. logback 会在类路径下寻找名为 logback-test.xml 的文件。
  2. 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。
  3. 如果没有找到,logback 会继续寻找名为 logback.xml 的文件。
  4. 如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了 Configurator 接口的实现类的全限定类名。
  5. 如果以上都没有成功,logback 会通过 BasicConfigurator 为自己进行配置,并且日志将会全部在控制台打印出来。

logback.xml

一个最简单的 logback.xml(放在 resources 目录下,自动扫描):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>

<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 输出日志格式 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<!-- 设置日志输出级别 -->
<root level="debug">
<appender-ref ref="CONSOLE" />
</root>
</configuration>

内容结构

appender 标签中的 name 属性是给该日志配置命名(自定义的),class 属性是通过类的全限定名称定义输出类型:

  • ch.qos.logback.core.ConsoleAppender:控制台输出
  • ch.qos.logback.core.rolling.RollingFileAppender:文件输出

这里的设置日志输出级别中的 ref 属性值是映射到 appender 标签的 name 属性的;level 属性值代表日志级别。

共有 5 个级别,由低到高分别为:

  1. TRACE
  2. DEBUG
  3. INFO
  4. WARN
  5. ERROR

设置了某一个日志级别后,只会输出大于等于该级别的日志信息。

输出格式

  • %d{HH:mm:ss.SSS}:时间格式。
  • %thread:线程。
  • %-5level:日志级别,并且使用5个字符靠左对齐。。
  • %logger{36}:日志输出者名称。
  • %msg:日志消息。
  • %n:平台换行符。

关于颜色

highlight(),高亮函数,括号内内容为高亮显示;高亮颜色区分:

  • TRACE 和 DEBUGE:默认颜色。
  • INFO:蓝色。
  • WARN:红色。
  • ERROR:加粗红色。

自定义颜色:

例如加粗绿色显示日志发出者:

1
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%boldGreen(%logger{56})] - %msg%n</pattern>

这里的 %boldGreen(%logger{56}) 就是这样的效果。

目前支持的颜色有:

函数 颜色
%black() 黑色
%red() 红色
%green() 绿色
%yellow() 黄色
%blue() 蓝色
%magenta() 品红色
%cyan() 青色
%white() 白色
%gray() 灰色
%boldRed() 加粗红色
%boldGreen() 加粗绿色
%boldYellow() 加粗黄色
%boldBlue() 加粗蓝色
%boldMagenta() 加粗品红色
%boldCyan() 加粗青色
%boldWhite() 加粗白色

内容抽取

以上 logback.xml 可以写成如下格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>

<!-- 控制台输出格式 -->
<property name="CONSOLE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%cyan(%logger{56})] - %msg%n"/>

<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 输出日志格式 -->
<pattern>${CONSOLE_FORMAT}</pattern>
</encoder>
</appender>

<!-- 设置日志输出级别 -->
<root level="debug">
<appender-ref ref="CONSOLE" />
</root>
</configuration>

输出到文件

配置概览

主要通过配置 logback.xml 文件来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<configuration>

<!-- 日志存放目录 -->
<property name="LOG_HOME" value="./logs"/>

<!-- 信息日志文件名 -->
<property name="INFO_FILE_NAME" value="${LOG_HOME}/system_info.%d{yyyy-MM-dd}.log"/>

<!-- 警告日志文件名 -->
<property name="WARN_FILE_NAME" value="${LOG_HOME}/system_warn.%d{yyyy-MM-dd}.log"/>

<!-- 错误日志文件名 -->
<property name="ERROR_FILE_NAME" value="${LOG_HOME}/system_error.%d{yyyy-MM-dd}.log"/>


<!-- 控制台输出格式 -->
<property name="CONSOLE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) [%cyan(%logger{56})] - %msg%n"/>

<!-- 文件输出格式 -->
<property name="FILE_FORMAT" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{56} - %msg%n"/>


<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 输出日志格式 -->
<pattern>${CONSOLE_FORMAT}</pattern>
</encoder>
</appender>

<!-- info 日志文件输出 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder charset="UTF-8">
<pattern>${FILE_FORMAT}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_FILE_NAME}</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>15</MaxHistory>
</rollingPolicy>
</appender>

<!-- warn 日志文件输出 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder charset="UTF-8">
<pattern>${FILE_FORMAT}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${WARN_FILE_NAME}</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>20</MaxHistory>
</rollingPolicy>
</appender>

<!-- error 日志文件输出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder charset="UTF-8">
<pattern>${FILE_FORMAT}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ERROR_FILE_NAME}</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>


<!-- 设置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>

拦截指定级别

主要通过 <filter> 标签实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只接收 INFO 级别的日志消息 -->
<level>INFO</level>
<!-- 不匹配 INFO 级别的日志消息时拒绝 -->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>

<encoder>
<!-- 输出日志格式 -->
<pattern>${TEXTAREA_FORMAT}</pattern>
</encoder>
<target>System.out</target>
</appender>

以上配置代表只接收 INFO 级别的日志。

<onMatch>ACCEPT</onMatch> 代表接受匹配的日志等级。

<onMismatch>DENY</onMismatch> 代表拒绝不匹配的日志等级。

指定日志名称

1
2
3
4
5
6
7
<!-- 程序执行消息 -->
<logger name="ProgramMessage" level="info" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="NORMAL_INFO_FILE" />
<appender-ref ref="NORMAL_WARN_FILE" />
<appender-ref ref="NORMAL_ERROR_FILE" />
</logger>

这里的 ProgramMessage 字符串是这个 logger 的名称,在定义 logger 时,可以使用该字符串指定该组 appender:

1
private final Logger logger = LoggerFactory.getLogger(LoggerConst.PROGRAM_MESSAGE);

其中的 level="info" 代表该组 appender 的起始级别(只拦截该级别及其以上的日志)。

additivity="false" 代表匹配到该名称后就不会往下继续匹配。

  • 标题: Logback-学习笔记
  • 作者: gs_huang
  • 创建于: 2023-07-24 17:24:08
  • 更新于: 2023-08-21 13:29:45
  • 链接: https://blog.itsheng.cn/2023/07/24/Logback-学习笔记/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论