SpringBoot整合Sfl4j+logback的实践

一、概述

对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。slf4j,log4j,logback,JDK Logging等这些日志框架都是我们常见的日志框架,本文主要介绍这些常见的日志框架关系和SpringBoot整合Sfl4j+logback的实践。

image-20230801224302326

二、日志系统介绍

1.日志系统介绍

首先slf4j可以理解为规则的制定者,是一个抽象层,定义了日志相关的接口。log4j,logback,JDK Logging都是slf4j的实现层,只是出处不同,当然使用起来也就各有千秋。

img

2.为什么使用Sfl4j+logback?

slf4j+logback是这些组合中最常见的日志搭配。总结起来起核心的优势有:(1)使用slf4j+logback的性能更高;(2)slf4jlogback框架的作者是同一个,所以兼容性更好。

三、SpringBoot整合Sfl4j+logback的实践

网上很多教程说明配置Sfl4j+logback时,都会要求引入logback-classic等依赖,这在使用Spring框架的时候确实是必须的,但在使用Springboot框架是没必须的,因为在spring-boot-starter中已经整合了Sfl4j+logback日志系统。

<dependency> 
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

image-20230801215848513

1.添加logback-spring.xml配置文件

以下是一个logback-spring.xm的常见配置,我们以以下这个模板来说明其中配置项的含义。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 一般根节点不需要写属性了,使用默认的就好 -->
<configuration>

    <contextName>demo</contextName>

    <!-- 该变量代表日志文件存放的目录名 -->
    <property name="log.dir" value="logs"/>
    <!-- 该变量代表日志文件名 -->
    <property name="log.appname" value="eran"/>

    <!--定义一个将日志输出到控制台的appender,名称为STDOUT -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 内容待定 -->
    </appender>

    <!--定义一个将日志输出到文件的appender,名称为FILE_LOG -->
    <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
        <!-- 内容待定 -->
    </appender>

    <!-- 指定com.demo包下的日志打印级别为INFO,但是由于没有引用appender,所以该logger不会打印日志信息,日志信息向上传递 -->
    <logger name="com.demo" level="INFO"/>

    <!-- 指定最基础的日志输出级别为DEBUG,并且绑定了名为STDOUT的appender,表示将日志信息输出到控制台 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

1. 标签

定义日志策略的节点,一个日志策略对应一个<appender>,一个配置文件中可以有零个或者多该节点,但一个配置文件如果没有定义至少一个<appender>,虽然程序不会报错,但就不会有任何的日志信息输出,也失去了意义。该节点有两个必要的属性:

  • name:指定该节点的名称,方便之后的引用。
  • class:指定该节点的全限定名,所谓的全限定名就是定义该节点为哪种类型的日志策略,比如我们需要将日志输出到控制台,就需要指定class的值为ch.qos.logback.core.ConsoleAppender;需要将日志输出到文件,则class的值为ch.qos.logback.core.FileAppender等。

2. 标签

用来设置某个包或者类的日志打印级别,并且可以引用 绑定日志策略,在该节点内可以添加子节点 <appender-ref>,该节点有一个必填的属性 ref,值为我们定义的 <appender>节点的 name属性的值。该节点有三个属性:

  • name:用来指定受此 约束的包或者类。
  • level:可选属性,用来指定日志的输出级别,如果不设置,那么当前 会继承上级的级别。
  • additivity:是否向上级传递输出信息,两个可选值true or false,默认为true。

3. 标签

  • <logger>一个特殊的<logger>,即默认name属性为root<logger>,因为是根<logger>,所以不存在向上传递一说,故没有additivity属性,所以该节点只有一个level属性。

常见的 配置如下:

<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>

异步写入日志AsyncAppender。AsyncAppender并不处理日志,只是将日志缓冲到一个BlockingQueue里面去,并在内部创建一个工作线程从队列头部获取日志,之后将获取的日志循环记录到附加的其他appender上去,从而达到不阻塞主线程的效果。因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来写日志。常见的配置如下:

<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->  
    <discardingThreshold >0</discardingThreshold>  
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->  
    <queueSize>512</queueSize>  
    <!-- 添加附加的appender,最多只能添加一个 -->  
    <appender-ref ref ="FILE_LOG"/>
</appender>

2.代码中添加日志逻辑

添加好logback-spring.xml配置文件后,就可以在代码中添加日志逻辑,添加也很简单,只需要通过log.info()这样的方式来实现。

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController01 {
    @RequestMapping("/hello")
    public String index() {
        log.debug("hello world0.");
        log.info("hello world.");
        log.warn("hello world1.");
        log.error("hello world2.");
        return "Hello World.";
    }

}

Slf4j有四个级别的log level可供选择,级别从上到下由低到高,优先级高的将被打印出来。

  1. debug:简单来说,对程序调试有利的信息都可以debug输出
  2. info:对用户有用的信息
  3. warn:可能会导致错误的信息
  4. error:顾名思义,发生错误的地方

为了简化创建logger对象的逻辑,可以直接使用lombok的@Slf4j的注解,只需要在pom文件中引入以下依赖:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.10</version>
  <scope>provided</scope>
</dependency>

具体代码实现和配置文件:https://github.com/yangnk/SpringBoot_Learning/tree/master/SpringbootLogDemo

四、其他

推荐一个IDEA中日志查看插件:Grep Console。这是一个帮你分析控制台日志的插件,可以对不同级别的日志进行不同颜色的高亮显示,具体效果如下:

image-20230801224143035

参考资料

  1. slf4j官网:https://www.slf4j.org/manual.html
  2. 一步一步带你熟悉SpringBoot 配置slf4j+logback:https://blog.csdn.net/weixin_49307478/article/details/126836019
  3. SpringBoot整合logback,slf4j:https://blog.csdn.net/weixin_42259925/article/details/103954982

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

自然语言处理: 第六章Transformer- 现代大模型的基石

理论基础 Transformer&#xff08;来自2017年google发表的Attention Is All You Need (arxiv.org) &#xff09;&#xff0c;接上面一篇attention之后&#xff0c;transformer是基于自注意力基础上引申出来的结构&#xff0c;其主要解决了seq2seq的两个问题: 考虑了原序列和目…

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…

【知网检索】2023年金融,贸易和商业管理国际学术会议(FTBM2023)

随着经济全球化&#xff0c;贸易自由化的进程加快&#xff0c;我国经济对外开放程度不断加深&#xff0c;正在加快融入世界经济一体化当中。当今世界各国竞争过程中&#xff0c;金融、贸易以及商业形态已成为其关键与焦点竞争内容。 2023年金融、贸易和商业管理国际学术会议(F…

科技云报道:向量数据库:AI时代的下一个热点

科技云报道原创。 最近&#xff0c;又一个概念火了——向量数据库。 随着大模型带来的应用需求提升&#xff0c;4月以来多家海外知名向量数据库创业企业传出融资喜讯。 4月28日&#xff0c;向量数据库平台Pinecone宣布获得1亿美元&#xff08;约7亿元&#xff09;B轮融资&am…

尚品汇总结七:商品详情模块(面试专用)

一、业务介绍 订单业务在整个电商平台中处于核心位置&#xff0c;也是比较复杂的一块业务。是把“物”变为“钱”的一个中转站。 整个订单模块一共分四部分组成&#xff1a; 结算页面 在购物车列表页面中,有一个结算的按钮,用户一点击这个按钮时,跳转到结算页,结算页展示了用…

ROS实现机器人移动

开源项目 使用是github上六合机器人工坊的项目。 https://github.com/6-robot/wpr_simulation.git 机器人运动模型 运动模型如下所示&#xff1a;&#x1f447; 机器人运动的消息包&#xff1a; 实现思路&#xff1a;&#x1f447;   为什么要使用/cmd_vel话题。因为这…

2023应急指挥系统总体架构方案 PPT

导读&#xff1a;原文《应急指挥系统总体架构方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

AssetBundle学习

官方文档&#xff1a;AssetBundle 工作流程 - Unity 手册 (unity3d.com) 之前写的博客&#xff1a;AssetBundle学习_zaizai1007的博客-CSDN博客 使用流程图&#xff1a; 1&#xff0c;指定资源的AssetBundle属性 &#xff08;xxxa/xxx&#xff09;这里xxxa会生成目录&…

Gof23设计模式之组合模式

1.定义 ​组合模式又名部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。 2.结构 组合模式主要包含三种…

【前端实习生备战秋招】—HTML 和 CSS面试题总结(一)

【前端实习生备战秋招】—HTML 和 CSS面试题总结&#xff08;一&#xff09; 1. 你做的页面在哪些流览器测试过&#xff1f;这些浏览器的内核分别是什么? IE:trident内核 Firefox&#xff1a;gecko内核 Safari:webkit内核 Opera:以前是presto内核&#xff0c;Opera现已改用Goo…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求&#xff1a; 创建基于Maven的Java项目&#xff0c;连接数据库&#xff0c;实现对站点信息的管理&#xff0c;即实现对站点的新增&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT N…

element-ui分页编辑器的使用

代码&#xff1a; 准备好初始数据; total: ,page: {pageSize: 1,pageNumber: 10,}, 当前显示在第一页,每页10条数据。 一,页码改变的事件 handleCurrentChange(val) { this.page.pageSizeval 通过传入(this.page) 获取当前页的数据 } 二.页容量改变 handleSizeChange(val) …

c++游戏制作指南(三):c++剧情类文字游戏的制作

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到静渊隐者的csdn博文&#xff0c;本文是c游戏制作指南的一部&#x1f35f; &#x1f355;更多文章请点击下方链接&#x1f355; &#x1f368; c游戏制作指南&#x1f3…

Java基础入门篇——IDEA开发第一个入门程序(五)

一、IDEA层级结构分类 IntelliJ IDEA的项目结构主要分为以下几个层级&#xff1a; Project&#xff1a; 项目Module: 模块Package: 包Class&#xff1a; 类 一个项目里面可以有多个模块&#xff0c;一个模块里面又可以有多个包&#xff0c;而每个包又可以存放多个类文件。比…

Eclipse如何自动添加作者、日期等注释

一、创建类时自动添加注释 1、Window->Preferences 2、Java->Code Syle->Code Templates->Code->New Java files->Edit->要添加的注释->Apply 二、选中要添加的类或者方法通过AltShiftJ快捷键添加 1、Window->Preferences 2、Java->Code Syle…

第四章 kernel函数基础篇

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

ubuntu 暂时不能解析域名 解决办法

需要修改系统DNS 打开终端&#xff1a;输入 sudo vi /etc/resolv.conf 回车 在打开的配置文件中添加DNS信息 nameserver 114.114.114.114 nameserver 8.8.8.8 保存退出&#xff0c;重启系统即可。

腾讯云-宝塔添加MySQL数据库

1. 数据库菜单 2. 添加数据库 3. 数据库添加成功 4. 上传数据库文件 5. 导入数据库文件 6. 开启数据库权限 7. 添加安全组 (宝塔/腾讯云) 8. Navicat 连接成功

Linux jq 命令讲解与实战操作(json字符串解析工具)

文章目录 一、概述二、jq 命令安装三、jq 命令语法与示例详解1&#xff09;基本用法2&#xff09;常用选项3&#xff09;查询和过滤1、选择字段2、过滤3、遍历数组4、组合操作 4&#xff09;修改和创建1、修改字段值&#xff1a;2、创建新字段&#xff1a;3、组合操作&#xff…