系列文章目录
【ruoyi-vue】 关于slf4j日志使用
文章目录
- 系列文章目录
- 一、slf4j概述
- 二、使用slf4j
- 1.代码方式使用Slf4j
- 2.lombok使用注解引入@Slf4j
- 3.对关键模块单独记录日志文件
- 三、配置slf4j
- 1.项目配置
- 2.改造
- 3. 日志级别及优先级
- 四、logback.xml配置文件解析
- 1.定义日志文件的存储地址
- 2.定义日志格式
一、slf4j概述
SLF4J(Simple Logging Facade for Java)是一个简单的日志门面,允许使用者在应用程序中使用不同的日志实现(例如Logback、Log4j、java.util.logging等)而不需要改变应用程序的代码。SLF4J不是一个具体的日志实现,而是一个抽象的日志接口,它提供了一组用于日志记录的方法,使得开发者可以在应用程序中编写日志记录代码,而无需关心具体的日志实现。
SLF4J的主要优势包括:
- 简单性:SLF4J的API设计简单易用,容易理解和使用。
- 灵活性:SLF4J允许开发者在不同的日志实现之间切换,而不需要修改应用程序的代码。
- 性能:SLF4J的设计追求高性能,同时支持延迟加载和参数化日志记录,可以提高应用程序的性能。
- 广泛支持:SLF4J被广泛应用于Java生态系统中的各种项目和框架中,是Java应用程序中最常用的日志门面之一。
总的来说,SLF4J是一个简单、灵活、高性能的日志门面,可以帮助开发者在Java应用程序中方便地进行日志记录,并且能够轻松地切换不同的日志实现。
二、使用slf4j
1.代码方式使用Slf4j
SpringBoot框架内部已经集成slf4j,因此并不需要引入其他依赖,使用时需要在类中使用LoggerFactory.getLogger(类名.class)
可以获取到logger对象
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);public void test(){logger.info("输出日志");}
2.lombok使用注解引入@Slf4j
使用lombok只需要引入依赖后在类上加@Slf4j注解即可直接使用
在ruoyi-common模块的pox.xml中添加
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
//topic = "xz-mqtt" 指定日志附加器的名字,需要在logback.xml定义,默认 @Slf4j 即可
@Slf4j(topic = "xz-mqtt")
@RestController
@RequestMapping("/demo/test")
public class DemoController {public void test(){logger.info("输出日志");}
}
3.对关键模块单独记录日志文件
根据 logback.xml 的配置使用下面的注解和 私有的Logger变量 即可实现对指定模块的单独记录
@Slf4j(topic = "xz-mqtt")
或
private Logger loggerMqtt = LoggerFactory.getLogger("xz-mqtt");
三、配置slf4j
1.项目配置
application.yml
# 日志配置
logging:level:com.ruoyi: debug org.springframework: warn
logging.level:配置指定包的路径下应用程序的日志记录和日志级别。
ruoyi-vue 默认配置文件 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 日志存放路径 --><property name="log.path" value="/home/ruoyi/logs" /><!-- <property name="log.path" value="D:\home" />--><!-- 日志输出格式 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 用户访问日志输出 --><appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-user.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统模块日志级别控制 --><logger name="com.ruoyi" level="info" /><!-- Spring日志级别控制 --><logger name="org.springframework" level="warn" /><root level="info"><appender-ref ref="console" /></root><!--系统操作日志--><root level="info"><appender-ref ref="file_info" /><appender-ref ref="file_error" /></root><!--系统用户操作日志--><logger name="sys-user" level="info"><appender-ref ref="sys-user"/></logger>
</configuration>
2.改造
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 日志存放路径 -->
<!-- <property name="log.path" value="/home/ruoyi/logs" />--><property name="log.path" value="D:\home" /><!-- 日志输出格式 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 高亮日志格式 --><property name="HIGHLIGHT_PATTERN" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- <pattern>${log.pattern}</pattern>--><pattern>${HIGHLIGHT_PATTERN}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 用户访问日志输出 --><appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-user.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 用户访问日志输出 --><appender name="xz-mqtt" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false --><prudent>false</prudent><!-- 日志日常打印日志文件,生成日志示例:${log.path}/xz-mqt.log 生成到项目中,如果指定 D:/log 则生成到 D盘下log文件夹中--><file>${log.path}/xz-mqt.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily 即每天都会重新创建新的日志文件--><fileNamePattern>${log.path}/xz-mqt.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 ,60天之前的会被清理掉--><maxHistory>60</maxHistory></rollingPolicy><encoder><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{20}: 表示Logger名称,最多占据20个字符的空间 %method: 表示调用日志输出方法的名称 %L: 表示行号 %msg:日志消息,%n是换行符--><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统模块日志级别控制 --><logger name="com.ruoyi" level="info" /><!-- Spring日志级别控制 --><logger name="org.springframework" level="warn" /><root level="info"><appender-ref ref="console" /></root><!--系统操作日志--><root level="info"><appender-ref ref="file_info" /><appender-ref ref="file_error" /></root><!--系统用户操作日志--><logger name="sys-user" level="info"><appender-ref ref="sys-user"/></logger><!--mqtt操作日志--><logger name="xz-mqtt" level="trace"><appender-ref ref="xz-mqtt"/></logger>
</configuration>
3. 日志级别及优先级
-
trace(跟踪):一般用来追踪详细的程序运行流,比如程序的运行过程中,运行到了哪一个方法,进入了哪一条分支。通过trace程序的运行流程,可以判断程序是否按照期望的逻辑在运行
-
debug(调试):这类日志往往用在判断是否有出现bug的场景,且往往记录了代码运行的详细信息,比如方法调用传入的参数信息
-
info(消息):用来记录程序运行的一些关键信息,它不像trace那样记录程序运行的整个流程,也不像debug那样为了解决问题而记录详细的信息。info记录的是整个系统的运行信息,比如系统运行到了哪一个阶段,到达了哪一个状态
-
warn(警告):用来记录一些警告信息。警告信息表示,程序进入了一个特殊的状态,在该状态下程序可以继续运行,但是不建议让程序进入该状态,因为该状态可能导致结果出现问题
-
error(错误):用来记录运行时的错误信息,表示程序运行过程中出现了需要被解决的问题,往往是一些异常。使用error日志的时候,一般会将详细的异常出现的原因记录
日志优先级从高到低依次为trace、debug、info、warn、error。相对而言,打印的日志会越来越少。
四、logback.xml配置文件解析
1.定义日志文件的存储地址
<property name="log.path" value="D:\home" />
项目 | Value | 作用 |
---|---|---|
log.path | log.path | 定义日志文件存放的路径 |
2.定义日志格式
<!-- 日志输出格式 --><property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 高亮日志格式 --><property name="HIGHLIGHT_PATTERN" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50})- [%method,%line] - %highlight(%msg) %n"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- <pattern>${log.pattern}</pattern>--><pattern>${HIGHLIGHT_PATTERN}</pattern></encoder></appender>
- %d{yyyy-MM-dd HH:mm:ss.SSS} : 表示日期和时间,格式为年-月-日 时:分:秒.毫秒
- %thread]: 表示线程名
- %-5level: 表示日志级别,左对齐,最少占据5个字符的空间
- %logger{20}: 表示Logger名称,最多占据20个字符的空间( 即 LoggerFactory.getLogger(“xz-mqtt”); 或者 LoggerFactory.getLogger(IndexController.class);
- %method: 表示调用日志输出方法的名称
- %L: 表示行号
- %msg:表示日志消息
- %n: 表示换行符
//javalogger.warn("---warn ---警告--- ");logger.error("---err---错误---");
//控制台
2024-04-25 14:19:00.688 [http-nio-9099-exec-1] WARN xz-mqtt - [listFiles,17] - ---warn ---警告---
2024-04-25 14:19:00.688 [http-nio-9099-exec-1] ERROR xz-mqtt - [listFiles,18] - ---err---错误---
其中 %red(xxxxxxx) %green(xxxx) %highlight() 这些颜色可以自定义修改