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

深入理解Spring Boot日志框架与配置

目录

  1. Spring Boot日志框架概述
  2. Spring Boot默认日志框架:Logback
  3. 日志配置文件
  4. 日志级别的调整
  5. 日志输出配置
  6. 日志格式化
  7. 日志轮转和归档
  8. 集成其他日志框架
  9. 日志管理工具
  10. 最佳实践
  11. 总结

Spring Boot日志框架概述

Spring Boot 支持多种日志框架,如 Logback、Log4j2 和 Java Util Logging (JUL)。其中,Logback 是 Spring Boot 默认使用的日志框架。Spring Boot 通过 spring-boot-starter-logging 依赖提供对这些日志框架的支持,并自动配置默认的日志设置。

常见的日志框架有:

  • Logback
  • Log4j2
  • Java Util Logging (JUL)
  • SLF4J (Simple Logging Facade for Java)

统一日志接口:SLF4J

SLF4J 是一个简单的日志门面,它为各种日志框架提供了统一的接口。开发者可以在代码中使用 SLF4J API,而在运行时选择具体的日志框架实现。Spring Boot 默认集成了 SLF4J,并使用 Logback 作为实际的日志实现。

Spring Boot默认日志框架:Logback

Logback 是由 Log4j 的作者开发的一个开源日志框架,具有性能高、灵活性强、易于配置等特点。Spring Boot 默认集成了 Logback,并提供了一些默认的配置。

默认配置

Spring Boot 的默认日志配置非常简单且易于理解。默认情况下,日志会输出到控制台,并使用以下格式:

%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

示例输出:

2024-08-09 12:34:56 [main] INFO  com.example.demo.Application - Starting Application on localhost with PID 1234

日志配置文件

Spring Boot 支持多种格式的日志配置文件,包括 application.propertiesapplication.yml 和原生的 Logback 配置文件 logback-spring.xmllogback.xml

使用application.properties进行配置

application.properties 文件中,可以通过 logging 前缀来配置日志设置。例如:

# 设置日志级别
logging.level.root=INFO
logging.level.com.example=DEBUG# 配置日志文件
logging.file.name=logs/myapp.log# 配置日志文件大小和归档策略
logging.file.max-size=10MB
logging.file.max-history=30

使用logback-spring.xml进行配置

对于复杂的日志配置,可以使用 logback-spring.xmllogback.xml 文件。以下是一个简单的 logback-spring.xml 示例:

<configuration><property name="LOG_PATH" value="logs"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE" /></root>
</configuration>

日志级别的调整

日志级别决定了日志记录的详细程度。常见的日志级别有:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL(Log4j2 特有)

日志级别是有层次的,从 TRACEERROR,记录的信息越来越少。可以在 application.propertieslogback-spring.xml 文件中配置不同包或类的日志级别。

在application.properties中配置日志级别

# 设置根日志级别
logging.level.root=INFO# 设置特定包的日志级别
logging.level.com.example=DEBUG
logging.level.org.springframework.web=ERROR

在logback-spring.xml中配置日志级别

<logger name="com.example" level="DEBUG"/>
<logger name="org.springframework.web" level="ERROR"/>

日志输出配置

Spring Boot 允许将日志输出到不同的目标,如控制台、文件、数据库等。可以在 application.propertieslogback-spring.xml 文件中进行配置。

输出到控制台

默认情况下,Spring Boot 会将日志输出到控制台。如果需要自定义控制台输出格式,可以在 logback-spring.xml 中配置 ConsoleAppender

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><root level="INFO"><appender-ref ref="STDOUT" />
</root>

输出到文件

将日志输出到文件,可以在 application.properties 中配置:

# 配置日志文件路径
logging.file.name=logs/myapp.log# 配置日志文件大小和归档策略
logging.file.max-size=10MB
logging.file.max-history=30

或者在 logback-spring.xml 中配置 RollingFileAppender

<property name="LOG_PATH" value="logs"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><root level="INFO"><appender-ref ref="FILE" />
</root>

输出到数据库

将日志输出到数据库,可以在 logback-spring.xml 中配置 DBAppender。以下是一个将日志输出到MySQL数据库的示例:

<appender name="DB" class="ch.qos.logback.core.db.DBAppender"><connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"><driverClass>com.mysql.cj.jdbc.Driver</driverClass><url>jdbc:mysql://localhost:3306/logdb</url><user>username</user><password>password</password></connectionSource><sql><![CDATA[INSERT INTO log_entries (timestamp, level, logger, message)VALUES (CURRENT_TIMESTAMP, %level, %logger, %message)]]></sql>
</appender><root level="INFO"><appender-ref ref="DB" />
</root>

日志格式化

日志格式化指的是日志输出的格式,可以通过配置来定义日志的显示样式。Spring Boot 使用Logback的PatternLayout来格式化日志。

在application.properties中配置日志格式

# 配置控制台日志格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n# 配置文件日志格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n

在logback-spring.xml中配置日志格式

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>

日志轮转和归档

日志轮转和归档是指将日志文件按一定规则进行分割和存档,以防止日志文件过大。Logback 提供了灵活的日志轮转和归档策略。

时间轮转策略

时间轮转策略可以按时间段(如每天、每小时)分割日志文件。在 logback-spring.xml 中配置 TimeBasedRollingPolicy

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>

大小轮转策略

大小轮转策略可以按文件大小分割日志文件。在 logback-spring.xml 中配置 SizeBasedTriggeringPolicy

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/myapp.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${LOG_PATH}/myapp.%i.log</fileNamePattern><minIndex>1</minIndex><maxIndex>10</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>10MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender>

集成其他日志框架

虽然 Spring Boot 默认使用 Logback,但它也支持其他日志框架,如 Log4j2 和 Java Util Logging (JUL)。可以通过替换 spring-boot-starter-logging 依赖来集成其他日志框架。

集成Log4j2

pom.xml 中添加 Log4j2 依赖,并排除 spring-boot-starter-logging 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>

然后在 src/main/resources 目录下创建 log4j2-spring.xml 文件进行配置。

日志管理工具

在实际项目中,使用日志管理工具可以更方便地管理和分析日志数据。以下是一些常见的日志管理工具:

ELK Stack

ELK Stack 是由 Elasticsearch、Logstash 和 Kibana 组成的日志管理工具,可以用于集中化日志管理和分析。

  • Elasticsearch:分布式搜索引擎,用于存储和搜索日志数据。
  • Logstash:数据处理管道工具,用于收集、处理和转发日志数据。
  • Kibana:数据可视化工具,用于可视化日志数据和创建仪表板。

Graylog

Graylog 是一个开源的日志管理平台,提供强大的日志收集、处理、存储和分析功能。

Splunk

Splunk 是一个企业级的日志管理和分析工具,提供丰富的功能和强大的数据处理能力。

最佳实践

使用统一的日志接口

使用 SLF4J 作为统一的日志接口,可以在不同的日志框架之间切换,而不需要修改应用程序代码。

合理设置日志级别

根据不同的环境(开发、测试、生产)合理设置日志级别。在开发环境中,可以设置较低的日志级别(如DEBUG),以便调试;在生产环境中,设置较高的日志级别(如INFO或WARN),以减少日志量。

定期清理日志文件

定期清理旧的日志文件,防止日志文件占用过多的磁盘空间。可以通过日志轮转和归档策略自动管理日志文件。

使用日志管理工具

使用日志管理工具集中化管理和分析日志数据,及时发现和解决问题。

总结

日志是应用程序的重要组成部分,通过合理的日志配置和管理,可以提高应用程序的可维护性和可靠性。Spring Boot 提供了丰富的日志框架支持和简化的配置方式,使得日志集成和配置变得非常简单。

本文详细介绍了Spring Boot中的日志框架与配置,包括常用的日志框架、日志配置文件的格式、日志级别的调整、日志输出配置、日志格式化、日志轮转和归档、集成其他日志框架以及日志管理工具。希望通过本文的介绍,读者能够深入理解Spring Boot的日志机制,并在实际项目中灵活应用这些知识。

相关文章:

深入理解Spring Boot日志框架与配置

目录 Spring Boot日志框架概述Spring Boot默认日志框架&#xff1a;Logback日志配置文件日志级别的调整日志输出配置日志格式化日志轮转和归档集成其他日志框架日志管理工具最佳实践总结 Spring Boot日志框架概述 Spring Boot 支持多种日志框架&#xff0c;如 Logback、Log4…...

WPF——动态排名图表实现

开发环境 VS2022 .NET 8.0 MVVM Toolkit 8.2.2 需求 开发中需要实现按照成绩动态指名&#xff0c;以展示当前的竞赛成绩的一个实时情况及变化。 即如下效果&#xff1a; 需求分析 按照接收到的信息&#xff0c;就是要将获取到的集合排序&#xff0c;并且要将排序前后的变…...

reactive() 的局限性

reactive() API 有一些局限性&#xff1a; 有限的值类型&#xff1a;它只能用于对象类型 (对象、数组和如 Map、Set 这样的集合类型)。它不能持有如 string、number 或 boolean 这样的原始类型。 不能替换整个对象&#xff1a;由于 Vue 的响应式跟踪是通过属性访问实现的&…...

stm32f407vet6驱动3.2寸lcd(9341 FSMC hal)

最近在钻研一些显示屏&#xff0c;研究到了lcd显示屏&#xff0c;然后入手了一块f407的开发板,但是店家给的资料有点怪&#xff0c;是keil4的工程,我一打开显示缺少f407vexxx&#xff0c;keil现在还巨慢&#xff0c;然后我到处找资料&#xff0c;发现网上大多是vgt6,又去各家ve…...

替换后的最长重复字符(LeetCode)

题目 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符&#xff0c;并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后&#xff0c;返回 包含相同字母的最长子字符串的长度。 解题 def characterReplacement(s, k):count {}max_len…...

[sqlserver][sql]sqlserver查询表信息和字段信息

--查询一个表中的所有字段 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAMEzsyh_AccInfo --查询一个库下的所有表 select * from sysobjects where xtypeU --查询一个数据库下的所有字段 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME in(select nam…...

easypoi模板导出word并且合并行

导出流程 引入依赖制作模板合并导出 引入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.2</version> </dependency>制作模板 合并行是备注那一列&#xff0c;这一列…...

雨云美国二区E5v2服务器测评(非广告)

注&#xff1a;本文非广告&#xff0c;非推广 本文长期更新地址&#xff1a; 雨云美国二区E5v2服务器测评&#xff08;非广告&#xff09;-星零岁的博客https://blog.0xwl.com/13594.html 今天来测评一下雨云美国二区v2服务器。我测试的这台配置是4-8&#xff0c; 35 M上传&a…...

前端form表单post请求

前端请求post&#xff0c;以表单的形式&#xff0c;后端传来的str,就是url携带的参数 const form document.createElement(form); form.style.display none; form.setAttribute(target, _blank); form.setAttribute(method, post); form.setAttribute(action,url); var vars …...

oracle共享池(shared pool):一、工作原理、组成部分 二、软硬解析过程

文章目录 oracle整体结构图共享池&#xff08;shared pool&#xff09;shared pool的作用shared pool的组成查询 shared pool 各组成部分大小硬解析和软解析 oracle整体结构图 共享池&#xff08;shared pool&#xff09; shared pool的作用 1、 将 sql 语句解析成执行计划 …...

设计模式六大原则中的里氏替换原则

设计模式六大原则中的里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;是面向对象设计中一个至关重要的原则&#xff0c;它定义了继承的基本原则和约束&#xff0c;确保子类能够透明地替换父类&#xff0c;而不会破坏系统的正确性和稳定性。以下是对里…...

安装Cellpose

Cellpose是目前运用范围最广、效果最好的细胞分割模型&#xff0c;以下是安装方法。 3.1 安装cellpose 3.1.1 创建cellpose 打开Anaconda Navigator,如下图所示&#xff1a; 图3.1.1.1 Anaconda Navigator 依次点击 Environments、Create&#xff0c;在弹出的窗中&#xff0…...

图卷积神经网络算法

图神经网络 图卷积神经网络 GNN GCN 算法 咨询 图卷积神经网络&#xff08;GCN&#xff09; python D码&#xff0c;应用于节点分类。元学习&#xff0c;自监督学&#xff0c;transformer&#xff0c;lstm&#xff0c;cnn&#xff0c;bert&#xff0c;GAN&#xff0c;交通预测 …...

【C#】System.Text.Json

文章目录 主要特点使用场景基本用法序列化反序列化 自定义序列化与反序列化注意事项 System.Text.Json 是 .NET Core 3.0 及更高版本中引入的一个高性能的、低内存的 JSON 序列化与反序列化库。它是 .NET Core 和 .NET 5/6/7 等新版本中推荐的 JSON 处理方式&#xff0c;因为它…...

经典游戏,用java实现的坦克大战小游戏

今天给大家分享一个使用java编写的坦克大战小游戏&#xff0c;整体还是挺好玩的&#xff0c;通过对这款游戏的简单实现&#xff0c;加深对java基础的深刻理解。 一、设计思路 1.坦克大战小游戏通过java实现&#xff0c;其第一步需要先绘制每一关对应的地图&#xff0c;地图包括…...

linux开通端口命令

这块需要开通8088 8083 端口限制 查看已开放端口&#xff1a;sudo firewall-cmd --list-ports 开放8083端口&#xff1a;sudo firewall-cmd --add-port8088/tcp --permanent 开放8088端口&#xff1a;sudo firewall-cmd --add-port8083/tcp --permanent 移除端…...

5、并发锁机制之synchronized

并发锁机制之synchronized i/i--引起的线程安全问题分析原因分析i的JVM字节码指令i--的JVM 字节码指令结论 解决方案 synchronized的使用加锁方式使用synchronized解决之前的共享问题方式一方式二 synchronized底层实现原理分析查看synchronized的字节码指令序列重量级锁实现之…...

职场那些事:应对施暴者的智慧

在职场中&#xff0c;有些人用各种手段让你感到难受&#xff0c;让你屈服&#xff0c;甚至适应他们的变态心理。面对这种人&#xff0c;最重要的就是保持低调。&#x1f910; 很多同事选择倾诉&#xff0c;然而这其实是个大错特错。正如鲁迅所说&#xff0c;“同事间的悲欢并不…...

精细化管理和智慧化运营的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…...

vue项目配置基础路由vue-router

1、运行以下命令安装vue-router yarn add vue-router 2、在src目录下的components中新建两个vue页面 3、在src目录下新建router文件夹&#xff0c;在router文件夹下面新建index.js文件 4、配置main.js文件 //引入Vue import Vue from "vue"; //引入App import App…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...