摘要:本文介绍了Logback的使用方法和核心组件,以及配置说明。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
Maven 3.6.3
Logback 1.2.11
1 基本配置
1.1 管理依赖
添加依赖:
pom.xml1 2 3 4 5 6
| <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency>
|
1.2 配置文件
Logback默认查找以下配置文件:
- logback.groovy
- logback-test.xml
- logback.xml
- 若未找到,使用默认配置,仅将INFO级别的日志输出到控制台
创建配置文件:
logback.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <charset>UTF-8</charset> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern> </encoder> </appender>
<root level="info"> <appender-ref ref="CONSOLE"/> </root> </configuration>
|
1.3 记录日志
在代码中记录日志:
java1 2 3 4 5 6 7 8 9 10
| public class Demo { private static final Logger logger = LoggerFactory.getLogger(Demo.class); public static void main(String[] args) { logger.trace("跟踪信息"); logger.debug("调试信息"); logger.info("普通信息"); logger.warn("警告信息"); logger.error("错误信息"); } }
|
2 核心组件
2.1 Logger
Logger负责触发日志记录,是开发者直接操作的对象。
日志级别从低到高:
- TRACE:跟踪信息,最细粒度的信息。
- DEBUG:调试信息,用于开发阶段记录程序执行过程。
- INFO:普通信息,用于记录普通流程信息。
- WARN:警告信息,用于记录潜在危险信息。
- ERROR:错误信息,用于记录异常错误信息。
记录不同级别日志:
java1 2 3 4 5 6 7 8 9 10
| public class Demo { private static final Logger logger = LoggerFactory.getLogger(Demo.class); public static void main(String[] args) { logger.trace("跟踪信息"); logger.debug("调试信息"); logger.info("普通信息"); logger.warn("警告信息"); logger.error("错误信息"); } }
|
支持通过{}参数化日志:
java1 2 3 4 5 6
| public class Demo { private static final Logger logger = LoggerFactory.getLogger(Demo.class); public static void main(String[] args) { logger.info("{}登录成功,角色是{}", "张三", "用户"); } }
|
2.2 Appender
Appender负责定义日志输出到哪里,比如控制台、文件、数据库等。
一个Logger可以关联多个Appender,每个Appender可以有不同的输出级别和过滤器。
输出到控制台:
logback.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <charset>UTF-8</charset> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern> </encoder> </appender>
|
输出到文件,滚动记录:
logback.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>./logs/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>./logs/app-%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxFileSize>10MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <charset>UTF-8</charset> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n</pattern> </encoder> <append>true</append> </appender>
|
2.3 Encoder
Encoder负责定义日志的输出格式。
常用格式占位符:
| 符号 |
含义 |
%d{pattern} |
日期,pattern为日期格式:
- yyyy:年
- MM:月
- dd:日
- HH:小时(24小时制)
- hh:小时(12小时制)
- mm:分
- ss:秒
- SSS:毫秒
|
%t | %thread |
线程名 |
%p | %level |
日志级别 |
%c{len} | %logger{len} |
全类名,len表示长度,超过会从最外层包名开始缩写 |
%m | %msg |
日志消息 |
%n |
换行符 |
%F | %file |
文件名 |
%L | %line |
行号,影响性能,生产慎用 |
%M | %method |
方法名,影响性能,生产慎用 |
%X{key} |
MDC变量,需要在代码中设置变量 |
%ex | %exception |
异常堆栈,需要在调用时传入异常对象 |
%r | %relative |
从程序启动到记录日志的毫秒数 |
3 配置说明
3.1 configuration
配置文件的根元素。
常用属性:
| 属性名 |
作用 |
取值 |
| scan |
是否自动扫描配置文件变更 |
默认为false表示不扫描,设置为true表示扫描 |
| scanPeriod |
扫描周期 |
默认为1分钟,单位为毫秒 |
| debug |
是否开启调试模式 |
默认为false表示不开启,设置为true表示开启 |
示例:
logback.xml1 2
| <configuration scan="true" scanPeriod="30 seconds" debug="true"> </configuration>
|
3.2 property
定义变量,可以通过${变量名}引用。
示例:
logback.xml1 2
| <property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n"/>
|
3.3 appender
定义日志输出级别和输出位置。
常用属性:
| 属性名 |
作用 |
取值 |
| name |
名称,用于引用 |
字符串 |
| class |
全类名,支持多种输出方式 |
字符串 |
3.4 logger
定义特定包或者类的日志行为。
在Logger中可以关联多个Appender,每个Appender可以有不同的过滤器和编码器,对Logger支持的日志级别进行二次过滤。
常用属性:
| 属性名 |
作用 |
取值 |
| name |
包名或类名 |
字符串 |
| level |
可以使用的日志级别 |
日志级别:
- trace:跟踪级别
- debug:调试级别
- info:普通级别
- warn:警告级别
- error:错误级别
- off:关闭日志
|
| additivity |
是否在上级Logger输出日志,会导致重复输出 |
默认为true表示在上级Logger输出日志,设置为false表示不在上级Logger输出日志 |
示例:
logback.xml1 2 3 4
| <logger name="com.example.demo" level="debug" additivity="false"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </logger>
|
3.5 root
设置默认日志级别和输出位置,是所有Logger的父元素。
示例:
logback.xml1 2 3 4
| <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root>
|
4 参考配置
示例:
logback.xml1 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
| <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="30 seconds"> <property name="LOG_HOME" value="./logs"/> <property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %level %logger{50} - %msg%n"/> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <charset>UTF-8</charset> <pattern>${PATTERN}</pattern> </encoder> </appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> <encoder> <charset>UTF-8</charset> <pattern>${PATTERN}</pattern> </encoder> <append>true</append> </appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <charset>UTF-8</charset> <pattern>${PATTERN}</pattern> </encoder> </appender>
<root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> <appender-ref ref="FILE_ERROR"/> </root> </configuration>
|
条