【SpringBoot系列】SpringBoot日志配置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.基础介绍
      • 1.日志顺序
      • 2.日志原理
    • 二.日志配置
      • 1.自定义 log
      • 2.配置 log 输出
      • 3.设置不打印
      • 4.配置文件
    • 三.日志文件
      • 1.日志配置方式一
      • 2.日志配置方式二

一.基础介绍

1.日志顺序

日志级别顺序:
DEBUG < INFO < WARN < ERROR < FATAL

SpringBoot 中使用 info 日志级别打印 mybatis SQL 语句,在 Spring Cloud 项目中,生产环境需要打印 mybatis 的 SQL 语句日志,但是 mybatis 打印的 SQL 的默认日志级别是 [debug],如果生产环境想看到 SQL 语句,就必须开启[debug] 级别的日志打印,这样做 debug 日志量过大,显然不可行。

**解决思路:**Spring Boot 中通过 logback 打印 mybatis 的 SQL 语句日志,并自定义日志输出实现将 SQL 语句 [debug] 日志级别上升到 [info] 日志级别。

2.日志原理

常用的 mybatis 日志输出是由 org.apache.ibatis.logging.stdout.StdOutImpl 控制的。
根据 StdOutImpl.java 可看出日志都是 System.out.println(s); 的控制台输出,配置及源码如下

#application.xml
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出日志
public class StdOutImpl implements Log {

  public StdOutImpl(String clazz) {

  }

  @Override
  public boolean isDebugEnabled() {
    return true;
  }

  @Override
  public boolean isTraceEnabled() {
    return true;
  }

  @Override
  public void error(String s, Throwable e) {
    System.err.println(s);
    e.printStackTrace(System.err);
  }

  @Override
  public void error(String s) {
    System.err.println(s);
  }

  @Override
  public void debug(String s) {
    System.out.println(s);
  }

  @Override
  public void trace(String s) {
    System.out.println(s);
  }

  @Override
  public void warn(String s) {
    System.out.println(s);
  }
}

二.日志配置

1.自定义 log

要想改变 mybatis SQL 语句输出内容级别,则只需自定义 Log 实现类,重写 mybatis sql 打印方式及级别。代码如下

#application.xml
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper*.xml
  configuration:
 log-impl: com.jiafupeng.util.MySlf4jImpl # mybatis自定义日志输出实现类 并将[debug]日志输出成[info]日志
@Slf4j
public class MySlf4jImpl implements Log {
    public MySlf4jImpl(String clazz) {
    }

    @Override
    public boolean isDebugEnabled() {
        return log.isInfoEnabled();
    }

    @Override
    public void debug(String s) {
        log.info(s);
    }
}

2.配置 log 输出

指定 logback 的日志级别为 info,也可在 [info] 级别日志中查看 mybatis 的 sql 语句。

#logback.xml
<!-- 日志输出级别 -->
<root level="info">
 <appender-ref ref="FILE-INFO"/>
</root>

<!-- 如果想将mybatis-sql[info]日志单独输出到一个文件中,就加上如下配置 -->
<!-- <logger name="com.jiafupeng.util.MySlf4jImpl" level="info" additivity="false">-->
<!-- <appender-ref ref="FILE-SQL"/>-->
<!-- </logger>-->

3.设置不打印

生产环境如果不想打印 mybatis sql 则注释掉打印实现类即可,或者使用 NoLoggingImpl.java 作为实现类,具体看源码。

#日志配置
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper*.xml
#或
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # 无日志(默认有debug日志)

4.配置文件

#logback日志配置
logging:
  config: classpath:logback-spring.xml
  level:
    root: info
    springfox: error #spring的日志检查级别

三.日志文件

1.日志配置方式一

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="log.charset" value="utf-8"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %blue(%msg%n)"/>
    <property name="file.log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/xxx-dsc-xxx-insight-ai-replenish.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>
                logs/xxx-dsc-xx-xxx-ai-replenish-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${file.log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <logger name="com.xxx.dsc.xxx.xx.mapper" level="info" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING"/>
    </root>
</configuration>

2.日志配置方式二

方式二与方式一的区别在于可以根据不同的环境添加对应的日志存储和打印策略。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="log.charset" value="utf-8"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %blue(%msg%n)"/>
    <property name="file.log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}</pattern>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <springProfile name="dev,test,local">
        <property name="log.dir" value="./logs/"/>
        <property name="file.log.pattern"
                  value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX} %-5level [%thread] %logger{36} - %msg%n"/>

        <appender name="SYSTEM_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            
                <fileNamePattern>${log.dir}system/%d.log</fileNamePattern>  
            </rollingPolicy>
            <encoder>
                <pattern>${file.log.pattern}</pattern>
                <charset>${log.charset}</charset>
            </encoder>
            <append>true</append>
        </appender>

        <appender name="SQL_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            
                <fileNamePattern>${log.dir}/sql/%d.log</fileNamePattern>  
            </rollingPolicy>
            <encoder>
                <pattern>${file.log.pattern}</pattern>
                <charset>${log.charset}</charset>
            </encoder>
            <append>true</append>
        </appender>
    </springProfile>

    <!--    如果是本地环境,则设置控制台打印-->
    <springProfile name="test,uat">
        <logger name="com.kwan.springbootkwan.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>

    <!--    如果是dev和test环境,则不设置控制台打印,将日志保存到不同的文件-->
    <springProfile name="dev">
        <logger name="com.kwan.springbootkwan.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="SQL_LOG"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="SYSTEM_LOG"/>
        </root>
    </springProfile>
</configuration>

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187354.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子学会C/C++编程等级考试2021年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格…

Redis集群(新)

1.什么是集群 Redis集群实现了对Redis的水平扩容&#xff0c;可实现并发写操作&#xff0c;启动n个redis节点&#xff0c;将数据分别存储在不同的节点中&#xff0c;每块节点负责不同区域的插槽&#xff0c;所以Redis集群通过分区来提供一定程度的可用性。 Redis集群现采用的是…

Google hacking语法

Google hacking语法 文章目录 Google hacking语法site:inurl:intitle:filetypecacheintext注意 site: 搜索子域 跟域名site:www.baidu.com 定位 跟语言 site: jp inurl: 用于在特定url链接中搜索网站信息 inurl:login intitle: 使用intitle:指令返回页面标题中包含关键…

【pandas】数据透视表【pivot_table】

pivot_table pandas的pivot_table函数是一个非常有用的工具&#xff0c;用于创建一个数据透视表&#xff0c;这是一种用于数据总结和分析的表格形式。 以下是pivot_table的基本语法&#xff1a; pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean,…

vcsa6.7打补丁操作

首先到官网中查找到最新的patch&#xff0c;需要有注册账号才可操作 网址链接&#xff1a;https://customerconnect.vmware.com/patch#search 下载后把iso文件上传到磁盘中&#xff0c;vcsa虚拟机中做光盘iso挂接后&#xff0c; 使用浏览器输入https://ip:5480登录&#xff…

数组基础知识

数组基础&#xff08;不定时更新&#xff09; 数组基础 数组基础 &#xff08;1&#xff09;数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。数组下标都是从0开始的。数组内存空间的地址是连续的。 &#xff08;…

【unity实战】实现一个放置3d物品建造装修系统(附项目源码)

文章目录 最终效果前言绘制开始场景素材开始放置旋转物体扩展优化1. 绘制地图边界&#xff0c;确保放置物品在指定区域内工作2. 让模型所占面积大小更加准确3. 隐藏白色瓦片指示区域 最终效果其他源码参考完结 最终效果 前言 其实3d物品建造装修系统之前就已经做过了&#xff…

Vue框架学习笔记——事件处理

文章目录 前文提要事件处理的解析过程样例代码如下&#xff1a;效果展示图片&#xff1a;v-on:click"响应函数"v-on:click简写形式响应函数添加响应函数传参占位符"$event"注意事项 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包…

1、windows10系统下Qt5.12.0与卸载

一、安装包下载 1、Qt社区下载 https://download.qt.io/archive/qt/5.12/5.12.10/qt-opensource-windows-x86-5.12.10.exe 2、百度网盘下载 链接&#xff1a;百度网盘 请输入提取码 3、Qt官网下载&#xff1a; Try Qt | 开发应用程序和嵌入式系统 | Qt 二、安装提示 下…

android实战项目之二十二---如何快速APP中集成支付宝和微信支付功能

效果图 实现方案 jcenter 集成方式 implementation com.xgr.easypay:EasyPay:2.0.5 // 基类库&#xff0c;必选 implementation com.xgr.easypay:wechatpay:2.0.5 // 微信支付&#xff0c;可选 implementation com.xgr.easypay:alipay:2.0.5 // 支付宝支付&#xff0c;可…

vivado产生报告阅读分析21

其他命令选项 • -of_objects <suggestion objects> &#xff1a; 启用特定建议的报告。在此模式下运行时 &#xff0c; report_qor_suggestions 不会生成新建议。此命令可快速执行 &#xff0c; 读取 RQS 文件后 &#xff0c; 此命令可用于查看其中包 含的建议。其…

[JVM] 京东一面~说一下Java 类加载过程

系统加载 Class 类型的文件主要三步&#xff1a;加载->连接->初始化。连接过程又可分为三步&#xff1a;验证->准备->解析。 通过全限定名来加载生成 class 对象到内存中&#xff0c;然后进行验证这个 class 文件&#xff0c;包括文件格式校验、元数据验证&#xf…

从零开始学习管道:进程通信的概念,特点和示例

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容通过进程通信的概念&#xff0c;引入管道&#xff0c;实…

Leetcode201. 数字范围按位与

Every day a Leetcode 题目来源&#xff1a;201. 数字范围按位与 最直观的解决方案就是迭代范围内的每个数字&#xff0c;依次执行按位与运算&#xff0c;得到最终的结果&#xff0c;但此方法在 [left, right] 范围较大的测试用例中会因超出时间限制而无法通过&#xff0c;因…

linux开启apache服务

vim /etc/apache2/ports.conf 键盘输入i 进入插入编辑模式&#xff0c;修改apache2默认监听端口号为8080 &#xff0c;编辑好后&#xff0c;按Esc键“&#xff1a;wq!” 保存退出。&#xff08;注&#xff1a;端口也可以不修改&#xff09; 在终端输入“/etc/init.d/apache2 …

【JVM】一篇通关JVM垃圾回收

目录 1. 如何判断对象可以回收1-1. 引用计数法1-2. 可达性分析算法1-3. 四种引用强引用软引用弱引用虚引用终结器引用 2. 垃圾回收算法3. 分代垃圾回收4. 垃圾回收器5. 垃圾回收调优 1. 如何判断对象可以回收 1-1. 引用计数法 引用计数法 只要一个对象被其他变量所引用&…

qgis添加arcgis的FeatureServer

左侧浏览器-ArcGIS要素服务器-新建连接 http://sampleserver6.arcgisonline.com/arcgis/rest/services/ 展开-双击即可

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(三)

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(三) 不使用base64编码方式传递 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filter…

Linux的gcc,gdb基础

执行详解: 1)如何执行 路径可执行文件名 或者 路径可执行文件名 & (将进程放到后台执行); 可以把可执行文件放到 /usr/bin 就可以省略路径了; 思考:为什么? ps :/usr/bin ps,ls,pwd (先了解,后期写项目就知道为什么了) 2)两步执行与一步执行 a.可以三步合为一步,即…

中职组网络安全-FTPServer20221010.img(环境+解析)

任务环境说明&#xff1a; √服务器场景&#xff1a;FTPServer20221010.img √服务器操作系统&#xff1a;未知&#xff08;关闭链接&#xff09; √FTP用户名&#xff1a;attack817 密码&#xff1a;attack817 1.分析attack.pcapng数据包文件&#xff0c;通过分析数据包attack…