Java日志框架——Logback
参考博客:长路
简介
1.1 Logback概述
logback可以看作是log4j的升级版;logback分为三个模块, logback-core
, logback-classic
和logback-access
,其中 logback-core是核心,其他两个模块依赖core。
logback-core
是其它两个模块的基础模块。logback-access
访问模块与Servlet容器集成提供通过Http
来访问日志的功能。logback-classic
是 log4j 的一个改良版本。logback-classic完整实现SLF4J API。
1.2 日志级别
package ch.qos.logback.classic;
public final class Level implements Serializable {
public static final Level OFF = new Level(2147483647, "OFF");
public static final Level ERROR = new Level(40000, "ERROR");
public static final Level WARN = new Level(30000, "WARN");
public static final Level INFO = new Level(20000, "INFO");
public static final Level DEBUG = new Level(10000, "DEBUG");
public static final Level TRACE = new Level(5000, "TRACE");
public static final Level ALL = new Level(-2147483648, "ALL");
...
}
日志级别排序为:TRACE
< DEBUG
<INFO
< WARN
<ERROR
。
默认日志等级为Debug,其中OFF
与ALL
作为日志开关。
1.3 组件
Logger
:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
Appender
:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
Layout
:负责把事件转换成字符串,格式化的日志信息的输出。
在 Logback 中 Layout 对象被封装在encoder中。 也就是说我们未来使用的 encoder 其实就是Layout。
配置 | 介绍 |
---|---|
`` | |
<springProperty> | 通过该标签可以直接读取 application.yml 等配置文件中的配置 |
`` |
1.4 配置文件
Logback提供了3种配置文件
logback.groovy
logback-test.xml
logback.xml
(常用)(Maven 项目通常放在resource
文件夹中)
如果都不存在则采用默认的配置。(日志等级为DEBUG,默认输出到console)
1.5 日志输出格式
命令 | 解释 |
---|---|
%-5level | level日志等级设置为 5 个字符,左对齐 |
%d{yyyy-MM-dd HH:mm:ss.SSS} | 日期(例如:2022-10-18 21:39:22.681) |
%c | 当前类的完整名称(全限定名) |
%M | 当前执行日志的方法 |
%L | 行号 |
%thread | 线程名称 |
%m或者%msg | 信息 |
%n | 换行 |
项目中应用步骤
注意:SpringBoot 配置文件的加载顺序如下:
logback.xml
——> application.properties
——> logback-spring.xml
2.1 依赖
<!-- slf4j核心依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- Logback 日志实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
2.2 日志输出到控制台
2.2.1 logback.xml 配置文件模板
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- property 配置通用属性,方便后面的配置通过${name}形式引用 -->
<!-- %-5level level级别案例为设置5个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行 -->
<!-- 配置日志输出格式 -->
<!-- 以property形式将日志输出格式配置为文件通用的属性,后面配置输出方式可以重复复引用该通用属性 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>
<!-- 配置控制台 appender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出目标的配置
默认:System.out 表示黑色字体输出日志
设置:System.err 表示红色字体输出日志
-->
<target>
System.out
</target>
<!-- 配置日志输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式) -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置日志记录器 -->
<root level="All">
<!-- 引入appender -->
<appender-ref ref="consoleAppender"></appender-ref>
</root>
</configuration>
2.2.2 测试类
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* logback日志框架管理
*/
public class LogbackTest {
@Test
public void logTest(){
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
logger.error("error 错误信息");
logger.warn("warn 警告信息");
logger.info("info 运行信息");
logger.debug("debug 调试信息");
logger.trace("trace 追踪信息");
}
}
运行日志截图
2.3 日志输出到文件中
2.3.1 logback.xml 配置文件模板
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- property 配置通用属性,方便后面的配置通过${name}形式引用 -->
<!-- %-5level level级别案例为设置5个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行 -->
<!-- 配置日志输出格式 -->
<!-- 以property形式将日志输出格式配置为文件通用的属性,后面配置输出方式可以重复复引用该通用属性 -->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>
<!-- 配置文件输出路径 (将日志信息输出到项目类路径下的logs目录中的log.txt文件中) -->
<property name="logDirectory" value="./logs/log.txt" />
<!-- 配置控制台 appender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出目标的配置
默认:System.out 表示黑色字体输出日志
设置:System.err 表示红色字体输出日志
-->
<target>
System.out
</target>
<!-- 配置日志输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式) -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置文件 appender -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 引入文件位置 -->
<file>${logDirectory}</file>
<!-- 配置日志输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 引用 输出格式的 通用配置属性(引用上面的<property>标签中的日志格式) -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置日志记录器 -->
<root level="All">
<!-- 引入控制台 appender -->
<appender-ref ref="consoleAppender" />
<!-- 引入文件 appender -->
<appender-ref ref="fileAppender" />
</root>
</configuration>
运行效果:
2.4 按照日志级别输出日志到指定文件夹
yml 配置:
# logback日志存放位置
log:
path:
windows: /home/data/logs
# 打印sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
备注:
mybatis-plus日志配置,使用org.apache.ibatis.logging.stdout.StdOutImpl
只能打印SQL日志在控制台;如果想要SQL日志d印在日志文件中需要使用org.apache.ibatis.logging.slf4j.Slf4jImpl
;
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<!-- <include resource="org/springframework/boot/logging/logback/base.xml" /> -->
<!-- 不直接引用base.xm, 改为引入依赖的文件, 防止多个app部署同一套环境,导致/tmp/spring.log 权限问题 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<!-- 日志格式化模板 ,输出样例如下: -->
<property name="FILE_LOG_PATTERN" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c %M %L %thread %m%n"/>
<!-- APP 名称配置, 每个App都需要配置 -->
<property name="APP_NAME" value="monitor" />
<!-- APP安装Home目录配置, 每个App都需要配置 -->
<springProperty scope="context" name="APP_HOME" source="log.path.linux" />
<property name="LOG_HOME_PATH" value="${APP_HOME}/${APP_NAME}" />
<property name="DEBUG_LOG_FILE" value="${LOG_HOME_PATH}/debug/${APP_NAME}_debug"/>
<property name="INFO_LOG_FILE" value="${LOG_HOME_PATH}/info/${APP_NAME}_info"/>
<property name="WARN_LOG_FILE" value="${LOG_HOME_PATH}/warn/${APP_NAME}_warn"/>
<property name="ERROR_LOG_FILE" value="${LOG_HOME_PATH}/error/${APP_NAME}_error"/>
<property name="SQL_LOG_FILE" value="${LOG_HOME_PATH}/sql/${APP_NAME}_sql"/>
<!-- Error 级别 日志配置 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${ERROR_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- INFO 级别 日志配置 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${INFO_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印INFO日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- WARN 级别 日志配置 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${WARN_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印WARN日志 -->
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- DEBUG 级别 日志配置 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${DEBUG_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${SQL_LOG_FILE}.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
<level>DEBUG</level>
</filter>
</appender>
<logger name="com.jpin.water.dal.mapper" level="DEBUG" additivity="false">
<appender-ref ref="SQL_FILE" />
</logger>
<!-- 按包名称拆分日志级别后输出文件(指定不同的appender);
<loger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO,WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。 -->
<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别, 大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL,默认是DEBUG.;
另外Spring Boot 最好开启 INFO 级别或以上 日志,否则基础Debug日志会相当多,影响性能 -->
<root level="INFO">
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>