当前位置: 首页 > news >正文

springboot开发项目 SLF4J+Logback日志框架集成【最终篇】

在这篇文章之前,实际对于 springboot和SLF4J+Logback日志框架的使用 我已经分享过3篇关于springboot 日志的文章了。为什么会在写这篇最终篇,因为 前3篇分享的关于springBoot框架日志的配置方案,
发现了一个问题:只有项目启动的时候会以日期创建一个文件夹,然后当第二天的时候,该触发滚动策略的时候,创建新的日期文件夹,就不会触发了。
这篇文章就是为了解决这个问题,我重新整理测试 写了新的 关于 SLF4J+Logback日志框架的使用配置。如果后续又发现新的问题,我也会持续更新文章,也请小伙伴如果遇到相关问题,有解决方案大家多多交流学习。
先分享一下 以前3篇的文章地址:
第一篇:日志打印到控制台及日志输出到指定文件
https://blog.csdn.net/Drug_/article/details/137913293

第二篇:日志上报到飞书或钉钉的解决方案
https://blog.csdn.net/Drug_/article/details/139143307

第三篇:解决mybatis-plus 将sql语句 输出到日志文件
https://blog.csdn.net/Drug_/article/details/139351713

三篇文章都是解决不同的日志需求。
以下代码 会包含上面文章里的所有需求配置并解决了上面说的日志第二天不创建文件夹的相关问题
但是只会分享了 logback-spring.xml 文件,别的相关配置 请还参考上面3篇文章
那就直接上代码了
大家按需使用即可

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds"><!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --><!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --><!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --><!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --><springProperty scope="context" name="serviceName" source="spring.application.name" /><contextName>logback</contextName><!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --><!--    日志输出位置--><property name="log.path" value="/home/logs/xxxService" /><!-- 彩色日志 --><!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --><!-- magenta:洋红 --><!-- boldMagenta:粗红--><!-- cyan:青色 --><!-- white:白色 --><!-- magenta:洋红 --><property name="CONSOLE_LOG_PATTERN"value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%magenta(%msg%n)"/><!--输出到控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter><encoder><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><!--输出到文件--><!-- 时间滚动输出 level为 INFO 日志 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_info.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 每天日志归档路径以及格式 --><fileNamePattern>${log.path}/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 单个日志文件最多 200MB --><maxFileSize>200MB</maxFileSize><!-- 总日志文件最多 3G --><totalSizeCap>3GB</totalSizeCap><!--日志文件保留天数--><maxHistory>7</maxHistory></rollingPolicy><!-- 此日志文件只记录info级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 WARN 日志 --><appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_warn.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 单个日志文件最多 200MB --><maxFileSize>200MB</maxFileSize><!-- 总日志文件最多 3G --><totalSizeCap>3GB</totalSizeCap><!--日志文件保留天数--><maxHistory>7</maxHistory></rollingPolicy><!-- 此日志文件只记录warn级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>warn</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 ERROR 日志 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_error.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 单个日志文件最多 200MB --><maxFileSize>200MB</maxFileSize><!-- 总日志文件最多 3G --><totalSizeCap>3GB</totalSizeCap><!--日志文件保留天数--><maxHistory>7</maxHistory></rollingPolicy><!-- 此日志文件只记录ERROR级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><appender name="SendErrorMsgAppender" class="com.xxx.init.exception.SendErrorMsgAppender"><!-- 此日志文件只记录ERROR级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 mybatis debug 日志 只有debug模式mybatis 日志才会 所以必须开启debug    --><appender name="MYBATIS_DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_mybatis_sql.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM-dd,aux}/log-mybatis-sql-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 单个日志文件最多 200MB --><maxFileSize>200MB</maxFileSize><!-- 总日志文件最多 3G --><totalSizeCap>3GB</totalSizeCap><!--日志文件保留天数--><maxHistory>7</maxHistory></rollingPolicy><!-- 此日志文件只记录DEBUG级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。name:用来指定受此logger约束的某一个包或者具体的某一个类。level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未设置此属性,那么当前logger将会继承上级的级别。--><!--使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:--><!--开发环境:打印控制台--><springProfile name="dev"><!--可以输出项目中的,mybatis的sql debug日志  别的debug日志不打印, additivity="false" 不传播到根logger --><logger name="com.xxx.aaa.mapper" level="DEBUG"  ><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><logger name="com.xxx.aaa.service" level="DEBUG" ><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><logger name="com.baomidou.mybatisplus" level="DEBUG"  ><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><!--root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG可以包含零个或多个appender元素。--><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="ERROR_FILE" />
<!--            <appender-ref ref="SendErrorMsgAppender"/>--></root></springProfile><!--生产环境:输出到文件--><springProfile name="prd">
<!--     写这   只有 com.xxx包下的日志 会发送到飞书 -->
<!--        <logger name="com.xxx" level="INFO" >-->
<!--            <appender-ref ref="SendErrorMsgAppender"/>-->
<!--        </logger>--><logger name="com.xxx.aaa.mapper" level="DEBUG" additivity="false" ><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><logger name="com.xxx.aaa.service" level="DEBUG" additivity="false"><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false" ><appender-ref ref="MYBATIS_DEBUG_FILE"/></logger><!--     写这  所有的ERROR错误日志都会发送到飞书  --><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="ERROR_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="SendErrorMsgAppender"/></root></springProfile></configuration>

最终效果:
在这里插入图片描述
注意点: 当天的不会建立文件夹 隔天会把昨天的放进文件夹里面

封面图片,请忽略
在这里插入图片描述

http://www.lqws.cn/news/495055.html

相关文章:

  • 智慧园区数字孪生最佳交付实践:沉淀可复用场景模板,实现快速部署与定制化开发
  • 顶级思维方式——认知篇十一《传习录》笔记
  • docker一键清除指令
  • 医疗B端系统布局创新:医护操作界面与患者数据的差异化呈现
  • 【LeetCode】用双指针解决移除元素问题、合并两个有序数组求解
  • 动手学大模型(第二天)
  • STM32对接霍尔传感器
  • 用 Makefile 自动生成详解:从零到精通的硬核指南
  • AIGC工具平台-FishSpeech零样本语音合成
  • 第三章---需求分析
  • 最新发布 | “龙跃”(MindLoongGPT)大模型正式发布!龙跃而起,推动中国方案走向全球智能体前沿
  • 【达梦数据库】忘记SYSDBA密码处理方法-已适配
  • 电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)
  • Flink中的反压与背压:原理、检测与应对
  • WebSocket 进阶全攻略:心跳机制、断线重连、socket.io、鉴权与WSS配置
  • 实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)
  • Flux Reconstruction(FR,通量重构)方法
  • GO 语言学习 之 代码风格
  • Java面试复习指南:并发编程、JVM原理与Spring框架
  • RAG-Anything:打破边界的一体化多模态文档处理引擎
  • Recent Advances in Speech Language Models: A Survey
  • 全局配置Axios后的api使用指南
  • 纯血HarmonyOS5 打造小游戏实践:扫雷(附源文件)
  • 从0开始学习R语言--Day30--函数型分析
  • Unity | AmplifyShaderEditor插件基础(第十集:噪声的种类+火焰制作-中)
  • 如何将进度传给前端呢
  • UI设计 | 审美积累 | 极繁风格(Maximalism / Complex UI)
  • 左神算法之给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个
  • leetcode题解77:组合(回溯算法的门面)
  • STM32 串口通信②:蓝牙模块HC-05控制单片机