maven 依赖
springboot 项目中已经集成了 Logback 依赖。
对于非 springboot 项目中,需要引入如下依赖:
<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>
基本使用
如下代码:
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 类型的对象。
每一个 {}
都对应一个后面的参数,个数不限。
输出:
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 目录下,自动扫描):
<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:加粗红色。
自定义颜色:
例如加粗绿色显示日志发出者:
<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 可以写成如下格式:
<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 文件来实现。
<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> 标签实现:
<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>
代表拒绝不匹配的日志等级。
指定日志名称
<!-- 程序执行消息 -->
<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:
private final Logger logger = LoggerFactory.getLogger(LoggerConst.PROGRAM_MESSAGE);
其中的 level="info"
代表该组 appender 的起始级别(只拦截该级别及其以上的日志)。
additivity="false"
代表匹配到该名称后就不会往下继续匹配。