项目后本地日志
一、logback依赖
打开最外层的 pom.xml,查看 SpringBoot的依赖配置。
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
springboot已经内置 logback日志依赖: <artifactId>spring-boot-dependencies</artifactId> ctrl + 点击进入,
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
二、yml配置
配置路径: ruoyi-admin/src/main/resources/application.yml
# 日志配置
logging:
level:
com.ruoyi: @logging.level@
org.springframework: warn
config: classpath:logback-plus.xml
上面配置,
- config 配置文件:logback-plus.xml ,logback的配置文件(资源已经上传logback-plus.xml)
- 日志级别level: com.ruoyi: @logging.level@ 对应pom文件中,profiles里面的日志级别,如下:
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<logging.level>info</logging.level>
</properties>
<!--默认环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
日志样式展示:
使用示例:
package com.ruoyi.demo.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <简述>
* <详细描述>
*
* @author syf
* @date 2024年05月14日 14:27
*/
@SaIgnore
@Slf4j
@RestController
public class LogBackController {
/**
* <简述> org.slf4j.Logger.LoggerFactory 调用
* <详细描述>
* @author syf
* @date 2024/5/14 14:34
* @param null
* @return null
*/
Logger logger = LoggerFactory.getLogger(LogBackController.class);
@GetMapping("log1")
public R<Void> log1(){
logger.debug("debug");
logger.info("info");
return R.ok();
}
/**
* <简述>
* <详细描述> @Slf4j 注解
* 调用 log.debug("debug");
* @author syf
* @date 2024/5/14 14:34
* @return com.ruoyi.common.core.domain.R<java.lang.Void>
*/
@GetMapping("log2")
public R<Void> log2(){
log.debug("debug");
log.info("info");
return R.ok();
}
}
三、logback-plus.xml(已经上传资源中,自行下载 )
文件路径: ruoyi-admin/src/main/resources,目录下如截图:
配置属性解析:
1-property :定义变量(定义输入时间格式,样式等,appender 可以引用)2-appender : 定义日志输出(名称 路径 级别 等等,具体使用如下注解:)
3-async_error 中定义异步写入策略,file_error 定义编码规则,保存时间,日志级别等等
具体文件如注释:
<!--1-RollingFileAppender 滚动文件附加器--> <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> <!-- 日志最大的历史 30天 --> <maxHistory>30</maxHistory> </rollingPolicy> <!--2-编码器 输出格式--> <encoder> <pattern>${log.pattern}</pattern> </encoder> <!--3-阈值过滤器--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤的级别 --> <level>ERROR</level> <!-- 匹配时的操作:接收(记录) --> <onMatch>ACCEPT</onMatch> <!-- 不匹配时的操作:拒绝(不记录) --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- error异步输出 --> <appender name="async_error" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="file_error"/> </appender>
3- root 引用上面appender 如图:
四、p6spy SQL性能分析器使用
p6spy :sql 性能分析插件
如下:打印耗时,以及原来sql
- 加载参数缓存数据成功 Consume Time:15 ms 2024-05-14 16:24:27 Execute SQL:SELECT dict_code,dict_sort,dict_label,dict_value,dict_type,css_class,list_class,is_default,status,remark,create_by,create_time,update_by,update_time FROM sys_dict_data WHERE (status = '0')
1-依赖:<!-- sql性能分析插件 --> <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>${p6spy.version}</version> </dependency>
2-yml中开关:
p6spy: true 开发环境开启
生产环境关闭
--- # 数据源配置 spring: datasource: type: com.zaxxer.hikari.HikariDataSource # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content dynamic: # 性能分析插件(有性能损耗 不建议生产环境使用) p6spy: true # 设置默认的数据源或者数据源组,默认值即为 master 。。。。。。。。。。。。。。。省略
3- 配置文件 ruoyi-admin/src/main/resources/spy.properties
# p6spy 性能分析插件配置文件 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定义日志打印 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger #日志输出到控制台 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 使用日志系统记录 sql #appender=com.p6spy.engine.spy.appender.Slf4JLogger # 设置 p6spy driver 代理 #deregisterdrivers=true # 取消JDBC URL前缀 useprefix=true # 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # SQL语句打印时间格式 databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss # 实际驱动可多个 #driverlist=org.h2.Driver # 是否开启慢SQL记录 outagedetection=true # 慢SQL记录标准 2 秒 outagedetectioninterval=2 # 是否过滤 Log filter=true # 过滤 Log 时所排除的 sql 关键字,以逗号分隔 exclude=SELECT 1
五、 spy.properties 解析
1-P6SpyLogger:定义了打印格式
路径: com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
实现MessageFormattingStrategy ,可以实现以下多种打印格式:
public class P6SpyLogger implements MessageFormattingStrategy {
public P6SpyLogger() {
}
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
return StringUtils.isNotBlank(sql) ? " Consume Time:" + elapsed + " ms " + now + "\n Execute SQL:" + sql.replaceAll("[\\s]+", " ") + "\n" : "";
}
}
2-appender 输出位置
实现 P6Logger 接口,可以定义输出到 控制台、文件、日志等