当前位置: 首页 > 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.lryc.cn/news/574217.html

相关文章:

  • 用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践
  • Linux笔记---线程控制
  • 用安卓手机,怎样远程管理孩子iPhone屏幕使用时间?
  • 新高考需求之一
  • uniapp+vue3做小程序,获取容器高度
  • 世赛背景下,高职物联网应用开发赛项实训解决方案
  • 2025年小程序地图打车的5大技术革新:实时路况预测与智能调度升级
  • 【Docker基础】Docker容器管理:docker pause详解
  • 【文件】Linux 内核优化实战 - fs.inotify.max_user_watches
  • 用DeepSeek完成实际生产编程完整项目
  • 树莓派超全系列教程文档--(66)rpicam-apps可用选项介绍之视频选项
  • [论文阅读] 人工智能 + 软件工程 | AI 驱动工具在软件质量保证中的革新:挑战与未来之路
  • 物联网的全球布局与未来趋势
  • 【Golang玩转MCP】-实现一个加减乘除MCP服务
  • 1 Studying《Systems.Performance》7-13
  • 数据赋能(313)——合作共享——跨界融合
  • Modbus TCP转Profibus DP网关与JF - 600MT称重变送器在STEP 7快速配置
  • 计算机操作系统(十六)进程同步
  • DMDRS部署实施手册(ORACLE=》DM)
  • Long类型返回给前端精度丢失问题(解决方案)
  • AWS S3服务器访问日志启用
  • RAG实战基础篇/windows电脑快速部署qwen3:14B
  • Python Arrow 库详解:更智能的日期时间处理
  • 制造业B端页面个性化设计案例:生产流程监控的专属布局打造
  • 探秘 Java 安全利器 ——JVMTI
  • 揭开 Git 裸仓库的神秘面纱:`git clone --mirror` 详解与使用指南
  • idea 报错:java: 非法字符: ‘\ufeff‘
  • Node.js特训专栏-实战进阶:7.Express模板引擎选型与使用
  • 大数据时代UI前端的变革:从静态展示到动态交互
  • 数字孪生:为UI前端设计带来沉浸式交互新体验