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 初始化配置:
- logback 会在类路径下寻找名为 logback-test.xml 的文件。
- 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。
- 如果没有找到,logback 会继续寻找名为 logback.xml 的文件。
- 如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了
Configurator 接口的实现类的全限定类名。
- 如果以上都没有成功,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 个级别,由低到高分别为:
- TRACE
- DEBUG
- INFO
- WARN
- 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>
<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>
<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>
<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"> <level>INFO</level> <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" 代表匹配到该名称后就不会往下继续匹配。