Spring Boot使用slf4j+Logback进行日志记录

2023-11-07

Spring Boot使用slf4j+Logback进行日志记录

个人总结使用logback步骤:
(1).yml或.properties配置日志文件的所在路径和输出日志的范围、级别。
(2)配置好logback.xml文件的各项参数,包括日志输出格式、存储路径、控制台输出、日志文件的相关参数、日志输出级别。
(3)使用Logger在项目中打印日志。

以下内容来自于:武哥(倪升武)的Springboot经典笔记,如有冒犯,通知必删。

在开发中,我们经常使用 System.out.println() 来打印一些信息,但是这样不好,因为大量的使用 System.out 会增加资源的消耗。我们实际项目中使用的是 slf4j 的 logback 来输出日志,效率挺高的,Spring Boot 提供了一套日志系统,logback 是最优的选择。

1. slf4j 介绍

引用百度百科里的一段话:
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
这段的大概意思是:你只需要按统一的方式写记录日志的代码,而无需关心日志是通过哪个日志系统,以什么风格输出的。因为它们取决于部署项目时绑定的日志系统。例如,在项目中使用了 slf4j 记录日志,并且绑定了 log4j(即导入相应的依赖),则日志会以 log4j 的风格输出;后期需要改为以 logback 的风格输出日志,只需要将 log4j 替换成 logback 即可,不用修改项目中的代码。这对于第三方组件的引入的不同日志系统来说几乎零学习成本,况且它的优点不仅仅这一个而已,还有简洁的占位符的使用和日志级别的判断。

正因为 sfl4j 有如此多的优点,阿里巴巴已经将 slf4j 作为他们的日志框架了。在《阿里巴巴Java开发手册(正式版)》中,日志规约一项第一条就强制要求使用 slf4j:
1.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

“强制”两个字体现出了 slf4j 的优势,所以建议在实际项目中,使用 slf4j 作为自己的日志框架。使用 slf4j 记录日志非常简单,直接使用 LoggerFactory 创建即可。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test {
    private static final Logger logger = LoggerFactory.getLogger(Test.class);
    // ……
}

2. application.yml 中对日志的配置

Spring Boot 对 slf4j 支持的很好,内部已经集成了 slf4j,一般我们在使用的时候,会对slf4j 做一下配置。application.yml 文件是 Spring Boot 中唯一一个需要配置的文件,一开始创建工程的时候是 application.properties 文件,个人比较细化用 yml 文件,因为 yml 文件的层次感特别好,看起来更直观,但是 yml 文件对格式要求比较高,比如英文冒号后面必须要有个空格,否则项目估计无法启动,而且也不报错。用 properties 还是 yml 视个人习惯而定,都可以。本课程使用 yml。

我们看一下 application.yml 文件中对日志的配置:

logging:
  config: logback.xml
  level:
    com.itcodai.course03.dao: trace

logging.config是用来指定项目启动的时候,读取哪个配置文件,这里指定的是日志配置文件是根路径下的logback.xml文件,关于日志的相关配置信息,都放在logback.xml文件中了。logging.level是用来指定具体的 mapper 中日志的输出级别,上面的配置表示com.itcodai.course03.dao` 包下的所有 mapper 日志输出级别为 trace,会将操作数据库的 sql 打印出来,开发时设置成 trace 方便定位问题,在生产环境上,将这个日志级别再设置成 error 级别即可(本节课不讨论 mapper 层,在后面 Spring Boot 集成 MyBatis 时再详细讨论)。

常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。

3. logback.xml 配置文件解析

在上面 application.yml 文件中,我们指定了日志配置文件 logback.xmllogback.xml 文件中主要用来做日志的相关配置。在 logback.xml 中,我们可以定义日志输出的格式、路径、控制台输出格式、文件大小、保存时长等等。下面来分析一下:

3.1 定义日志输出格式和存储路径

<configuration>
	<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
	<property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
</configuration>

我们来看一下这个定义的含义:首先定义一个格式,命名为 “LOG_PATTERN”,该格式中 %date 表示日期,%thread 表示线程名,%-5level 表示级别从左显示5个字符宽度,%logger{36} 表示 logger 名字最长36个字符,%msg 表示日志消息,%n 是换行符。

然后再定义一下名为 “FILE_PATH” 文件路径,日志都会存储在该路径下。%i 表示第 i 个文件,当日志文件达到指定大小时,会将日志生成到新的文件里,这里的 i 就是文件索引,日志文件允许的大小可以设置,下面会讲解。这里需要注意的是,不管是 windows 系统还是 Linux 系统,日志存储的路径必须要是绝对路径。

3.2 定义控制台输出

<configuration>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
			<pattern>${LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</configuration>

使用 <appender> 节点设置个控制台输出(class="ch.qos.logback.core.ConsoleAppender")的配置,定义为 “CONSOLE”。使用上面定义好的输出格式(LOG_PATTERN)来输出,使用 ${} 引用进来即可。

3.3 定义日志文件的相关参数

<configuration>
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 按照上面配置的FILE_PATH路径来保存日志 -->
			<fileNamePattern>${FILE_PATH}</fileNamePattern>
			<!-- 日志保存15-->
			<maxHistory>15</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>

		<encoder>
			<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
			<pattern>${LOG_PATTERN}</pattern>
		</encoder>
	</appender>
</configuration>

使用 <appender> 定义一个名为 “FILE” 的文件配置,主要是配置日志文件保存的时间、单个日志文件存储的大小、以及文件保存的路径和日志的输出格式。

3.4 定义日志输出级别

<configuration>
	<logger name="com.itcodai.course03" level="INFO" />
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>
</configuration>

有了上面那些定义后,最后我们使用 <logger> 来定义一下项目中默认的日志输出级别,这里定义级别为 INFO,然后针对 INFO 级别的日志,使用 <root> 引用上面定义好的控制台日志输出和日志文件的参数。这样 logback.xml 文件中的配置就设置完了。

4. 使用Logger在项目中打印日志

在代码中,我们一般使用 Logger 对象来打印出一些 log 信息,可以指定打印出的日志级别,也支持占位符,很方便。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    private final static Logger logger = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/log")
    public String testLog() {
        logger.debug("=====测试日志debug级别打印====");
        logger.info("======测试日志info级别打印=====");
        logger.error("=====测试日志error级别打印====");
        logger.warn("======测试日志warn级别打印=====");

        // 可以使用占位符打印出一些参数信息
        String str1 = "blog.itcodai.com";
        String str2 = "blog.csdn.net/eson_15";
        logger.info("======倪升武的个人博客:{};倪升武的CSDN博客:{}", str1, str2);

        return "success";
    }
}

启动该项目,在浏览器中输入 localhost:8080/test/log 后可以看到控制台的日志记录:

==测试日志info级别打印=
==测试日志error级别打印
==测试日志warn级别打印=
======倪升武的个人博客:blog.itcodai.com;倪升武的CSDN博客:blog.csdn.net/eson_15

因为 INFO 级别比 DEBUG 级别高,所以 debug 这条没有打印出来,如果将 logback.xml 中的日志级别设置成 DEBUG,那么四条语句都会打印出来,这个大家自己去测试了。同时可以打开 D:\logs\course03\ 目录,里面有刚刚项目启动,以后后面生成的所有日志记录。在项目部署后,我们大部分都是通过查看日志文件来定位问题。

附:完整的logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

    <!-- 定义日志存储的路径,不要配置相对路径 -->
    <property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />

    <!-- 控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 按照上面配置的LOG_PATTERN来打印日志 -->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--每天生成一个日志文件,保存15天的日志文件。rollingFile是用来切分文件的 -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}</fileNamePattern>
            <!-- keep 15 days' worth of history -->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 单个日志文件的最大,超过则新建日志文件存储 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- project default level -->
    <logger name="com.itcodai.course03" level="INFO" />

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot使用slf4j+Logback进行日志记录 的相关文章

  • pytest 看不到正在测试的函数的日志

    我有一个像这样的烧瓶应用程序 from flask import Flask import logging app Flask name app route def catch all logging warning I m a warni
  • 如何防止记录机器人框架中除 Log 关键字之外的所有关键字?

    I am a beginner in robot framework I want the log file of my robot test to contain the logs for only the log keyword I t
  • 如何在 Android 中启用/禁用日志级别?

    例如 我有很多日志语句需要调试 Log v TAG Message here Log w TAG WARNING HERE 在设备电话上部署此应用程序时 我想关闭详细日志记录 我可以在其中启用 禁用日志记录 The Android 文档对日
  • 记录时何时出现致命错误?

    在 log4j 和 log4net 等日志框架中 您可以记录各种级别的信息 大多数级别都有明显的意图 例如 调试 日志与 错误 日志是什么 然而 我一直害怕的一件事是将我的日志记录归类为 致命 哪种类型的错误如此严重以至于应被归类为致命错误
  • 无法使用基于日志的指标显示数据(指标类型:“计数器”)

    我正在努力创建一个带有 stackdriver 监控和基于日志的指标的图表 我的指标是一个计数器 默认情况下没有单位 日志可用于我的基于日志的指标 但是当我使用我的指标创建图表时 它说no data is available for the
  • JavaMail 的 DCH 类错误

    我正在尝试使用 Glassfish 3 1 提供的 jar 文件在 Java EE 6 中使用 JavaMail 设置一个简单的日志记录测试 关于这个主题似乎有很多问题 但我还没有找到任何有帮助的答案 我的测试代码如下所示 import j
  • NodeJS 中的缩进多行日志记录

    我要打印JSON stringify d 反对控制台 将上下文作为 Mocha 测试套件输出的一部分 当测试缩进时 我希望对象日志行向右缩进足够远 例如 3 4 个制表符空格 以便它们可以识别地位于右侧describe group 我怎样才
  • 如何使用 Zend_Db 启用 SQL 输出到日志文件?

    我想知道 Zend Db 是否可以做到这一点 但我正在寻找类似 SQL 查询日志记录之类的东西 类似于 Hibernate 的做法 它向您显示它在日志文件中生成的 SQL 您可以使用 Zend Db Profiler 来完成此任务 教程 Z
  • 如何在 git 中仅获取唯一的提交

    我想获取所有分支中唯一提交的列表 但是如果有人在分支中使用 rebase 则会提交松散的父项 如何解决这个问题呢 如何获取进行独特更改的提交列表 I use git log oneline graph cherry pick left ri
  • 如何将log4j日志文件更改为utf8

    我收到了一个使用 log4j 作为记录器应用程序的代码 如何为其生成 UTF8 日志文件 log4j 创建的日志文件目前为 ASCII 格式 我已经尝试过以下操作 按照以下说明设置日志文件的文件编码 vi current set bomb
  • Log4Net“找不到架构信息”消息

    我决定使用log4net http logging apache org log4net index html作为新 Web 服务项目的记录器 一切工作正常 但对于我在我的应用程序中使用的每个 log4net 标签 我都会收到很多类似下面的
  • 包装 NLog 时如何保留调用点信息

    我有一个包装 NLog 的类 称为 NLogger 我的日志保存到我的数据库中 我遇到的问题是如何显示日志记录发生的位置 我有这个
  • Net Core ILogger 值不能为空

    我收到记录器值不能为空 我正在尝试解决这个问题 也许是通过依赖注入来解决的 在单元测试和程序中的其他地方都会收到错误 我是否正确进行依赖注入 Expected
  • Jsoup http 日志记录

    有没有办法记录http请求和响应 我们假设以下请求 Connection Response res Jsoup connect LOGIN URL HERE data user USER pass PASS method Connectio
  • 使用 Celery 时出现错误消息“无法找到记录器“多处理”的处理程序”

    RabbitMQ http en wikipedia org wiki RabbitMQ现在似乎工作正常 然而 当我尝试 python m celery bin celeryd loglevel INFO 常规的celeryd不起作用 我收
  • Datadog 交易持续时间作为指标

    我们拥有来自不同服务且具有一个 CustomerID 的日志 SERVICE A CustomerID 11 Event start session Time 10 00 00 SERVICE B CustomerID 11 Event f
  • apache2.4.7 未将“404 Not Found”页面记录到 error.log

    我见过有关如何做的问题not将404错误记录到错误日志中 这是相反的 由于某种原因 我的 apache 安装没有将 404 错误记录到我的错误日志 或与此相关的访问日志 我已经正确设置了错误日志并看到了错误 但是当我访问不存在的页面时 我只
  • 如何检查docker中当前/默认的日志驱动程序?

    我正在尝试检查已停止的 docker 容器的日志 但是当我这样做时docker logs
  • 如何在Mac上启动Syslogd服务器以接受远程日志记录消息?

    有人知道如何在 Mac 上启动 Syslogd 服务器来接受远程日志记录消息吗 我启动了 Syslogd 但似乎它不接受远程消息 如果我执行 netstat an 看起来 udp 端口 514 正在侦听 但是 如果我使用 nmap 从笔记本
  • 工作天蓝色日志记录设置

    我尝试设置跟踪日志记录有一段时间了 但就是无法让它正常工作 关于这个主题有这么多错误 过时的文章并没有帮助 但请有人给我一个良好且实用的设置 用于 Azure 1 6 的跟踪日志记录和查看 我想要做的就是能够从我的应用程序捕获和查看跟踪消息

随机推荐

  • 【C++ STL学习之四】容器list深入学习

    一 list基础 List使用一个双向链表来管理元素 图一显示了list的结构 图一 list的结构 任何型别只要具备赋值和可拷贝两种性质 就可以作为list的元素 二 list的功能 list的内部结构和vector和deque截然不同
  • 【学习笔记】阮一峰的ES6入门

    let const 块作用域 ES6引入块作用域 考虑到环境导致的行为差异太大 应该避免在块级作用域内声明函数 如果确实需要 也应该写成函数表达式 而不是函数声明语句 let let声明的变量只在它所在的代码块有效 let不允许在相同作用域
  • 蓝桥杯经验贴(第十四届蓝桥杯C++B组)

    个人背景 在参加第十四届蓝桥杯前 系统学过基础算法和简单数据结构 能熟练使用C 编写程序 参加过CCPC河北省赛 力扣通过题数1300 省赛和国赛的准备阶段 在https www dotcpp com https dasai lanqiao
  • 计算机网络:TCP 流量控制

    目录 操作系统缓冲区与滑动窗口的关系 窗口关闭 糊涂窗口综合症 参考资料 发送方在发数据给接收方时 要考虑接收方处理能力 如果一直无脑的发数据给对方 但对方处理不过来 那么就会导致触发重发机制 从而导致网络流量的无端的浪费 为了解决这种现象
  • Kafka集群搭建配置与eagle监控界面

    kafka集群环境搭建 首先在多台机器上搭建配置Kafka环境 可以参考Kafak环境搭建 Kafka kafka环境配置以及参数分析 集群搭建配置 对于kafka来说 一个单独的broker意味着kafka集群中只有一个节点 要想增加ka
  • IPFS环境搭建和用ipfs-api访问ipfs网络

    ipfs是去中心化星际文件系统 本文介绍节点软件ipfs环境搭建和使用方法 学习ipfs api在nodejs代码中访问ipfs网络 一 ipfs节点安装与使用 1 1下载节点软件 到官网下载windows版的ipfs节点软件 32位 64
  • Python 过滤次新股、停牌、涨跌停

    过滤次新股 是否涨跌停 是否停牌等条件 def filcon context bar dict tar list def zdt trade stock context bar dict yesterday history 2 1d clo
  • 【表的完整性约束&外键约束】

    外键约束 今天跟大家聊聊这个外键约束 简单来说呢 就是 嗯 关于两个表的操作 对 就是这样的 来跟我一起看看叭 1 什么是外键约束 外键约束 FOREIGN KEY 缩写FK 是用来实现数据库表的参照完整性的 外键约束可以使两张表紧密的结合
  • 绕坐标轴以及任意轴的旋转矩阵的推导

    概述 本文主要是针对 3D数学基础 图形与游戏开发 这本书的读书笔记 这本书前面部分还是讲得挺好的 有时间还是建议读一下 旋转矩阵的推导 旋转矩阵怎么来的我倒一直都没有概念 这本书里面对旋转矩阵的来历倒是给了我一些启发 首先从二维的旋转矩阵
  • 清华教授熬夜写出来的一套Python学习路线图,真的是yyds!

    首先 我是从零开始学Python的 以前也去过 现在看来我当初走了很多弯路 就把我的经验分享给大家吧 首先也是最重要的 你为什么要学Python 你是想做一个网站 写一个得心应手的工具 还是仅仅通过学校的考试 这极大地影响了你如何学习Pyt
  • xml中xsd/xsi/xsl/xmlns的区别和联系

    2023 01 13Fri才明白 具体解析xml文件的不是xml文件本身 xsi也不是在解析xml文件 只是检验xml文件是否符合标准 xsd是在限制xml文件的内容 而具体解析某个element究竟是什么样式 起到什么作用 是需要接收端自
  • 黑马程序员之---C学习笔记之printf与scanf使用及注意事项

    Java培训 Android培训 iOS培训 Net培训 一 printf函数介绍 printf函数是一个标准库函数 能够以精确的格式输出程序运算的结果 1 格式字符串 是由格式字符 包括 转换说明符 标志 域宽 精度 和普通字符组成 转换
  • Object setPrototypeOf()方法

    Set the prototype of an object 设置对象的原型 While you re here see my guide on JavaScript Prototypal Inheritance 当您在这里时 请参阅我的J
  • asp.net web开发框架_你还在为框架发愁?手把手带你搭建性能优越基于.NET Core框架...

    Hello 大家好 今天分享下ABP框架的搭建 旨在搭建一个成熟的API 基于前后端分离模式 可以让小伙伴只管业务 而不拘泥于框架架构的约束 玩技术的我们都知道 一个性能优越 成熟的框架是非常重要的 他可以为我们省下充足的时间 用于业务开发
  • STM32(HAL库)驱动OLED

    简介 通过STM32F103C8T6单片机采用HAL库方式对0 96寸OLED IIC通讯 屏幕进行驱动 之前GY906驱动通过软件IIC进行驱动 因此本次通过硬件IIC进行驱动 2 1 Cubemax初始化配置 首先进行初始化配置 点击进
  • 嵌入式MCU开发开源项目

    1 FreeModbus Slave Master RTT STM32 简介 FreeModbus是一款开源的Modbus协议栈 但是只有从机开源 主机源码是需要收费的 同时网上也没有发现比较好的开源的Modbus主机协议栈 所以才开发这款
  • 【备忘】es统计各个平台的每日活跃数量

    query bool must range unixtime gt 1631548800000 lt 1631635200000
  • 第十七课,帧缓存(后期处理)

    反向 void main FragColor vec4 vec3 1 0 texture screenTexture TexCoords 1 0 灰度 均分灰度 void main FragColor texture screenTextu
  • git diff,git format-patch,git apply和patch小问题三则

    这个文档主要是用来记录工作中遇到的git patch 相关的命令的介绍和相关常见问题的解决方案 Patch文件有3中 git 给我们提供了2种patch 方案 一是用git diff生成的标准patch 二是git format patch
  • Spring Boot使用slf4j+Logback进行日志记录

    Spring Boot使用slf4j Logback进行日志记录 个人总结使用logback步骤 1 yml或 properties配置日志文件的所在路径和输出日志的范围 级别 2 配置好logback xml文件的各项参数 包括日志输出格