Springboot 日志使用

在 Spring Boot 中,日志管理是通过集成常用的日志框架来实现的,如 Logback、Log4J2 和 Java Util Logging。默认情况下,Spring Boot 使用 Logback 作为日志实现。Spring Boot 的日志配置旨在提供一种简单的方式来配置日志,并默认优化了各种环境的日志配置。

一、日志的配置与使用

默认配置

Spring Boot 默认为应用程序提供了基本的日志配置。默认情况下,日志会输出到控制台,并显示信息级别(INFO)及以上的日志消息。你可以在应用程序的 application.propertiesapplication.yml 文件中进行简单的日志级别配置:

# application.yml
logging:level:root: WARNorg.springframework.web: DEBUGcom.myapp: INFO

在这些配置中,root 日志级别被设置为 WARN,而特定包的日志级别可以单独配置。

配置⽇志⽂件分割
logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
自定义日志配置

如果你想要进行更详细的日志配置,可以通过添加一个 logback-spring.xml 文件到你的 src/main/resources 目录中来覆盖默认的日志配置。这里是一个基本的 Logback 配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><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><logger name="org.springframework.web" level="DEBUG"/><logger name="com.myapp" level="INFO"/></configuration>

 要实现例如每天回滚日志或文件大小限制等功能,你应该使用 Logback 的配置文件。下面是一个基于 XML 的 Logback 配置示例,可以放在 logback-spring.xml 中,实现每天回滚和文件大小限制:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_FILE" value="/path/to/logs/app"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE}.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- daily rollover --><fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- keep 30 days' worth of history capped at 1GB total size --><maxHistory>30</maxHistory><totalSizeCap>1GB</totalSizeCap></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>1KB</maxFileSize></triggeringPolicy></appender><root level="info"><appender-ref ref="FILE"/></root>
</configuration>

在这个配置文件中,我们定义了一个控制台输出(STDOUT)和日志的格式。我们还设置了默认的日志级别和特定包的日志级别。

整合外部日志框架

如果你想要使用 Log4j2 而不是 Logback,你需要排除 Spring Boot 的默认日志依赖并引入 Log4j2 的依赖。在 pom.xml 文件中进行如下配置:

<dependencies><!-- 排除 Spring Boot 默认的 Logback 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- 添加 Log4j2 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>

二、日志的用途 

日志在软件开发和维护中扮演着至关重要的角色,提供了一种系统性的方式来记录应用程序的行为、监控系统状态、跟踪错误来源以及优化性能。具体来说,日志的主要用途包括:

1. 故障排查和调试
  • 错误跟踪: 日志记录应用程序在执行期间出现的错误和异常,这对开发人员定位问题源头非常有帮助。
  • 行为分析: 日志可以展示程序在特定时间的行为,帮助开发者理解事件的顺序,这在并发系统或复杂交互中尤其重要。
2. 性能监测
  • 性能指标: 通过日志收集关键操作的执行时间,可以帮助识别性能瓶颈。
  • 资源使用: 记录系统资源的使用情况,如CPU、内存和磁盘I/O,有助于分析性能问题和资源需求。
3. 安全审计
  • 访问记录: 记录谁在何时访问了系统的哪些部分,这对于遵守各种合规要求和进行安全审计非常重要。
  • 异常活动: 日志可以帮助识别潜在的安全威胁,如异常登录尝试或可疑操作。
4. 业务洞察和决策支持
  • 用户行为分析: 通过日志分析用户的行为模式,可以帮助企业优化用户体验和提升业务流程。
  • 操作趋势: 分析日志数据,可以揭示业务操作的趋势和周期性模式,为业务决策提供数据支持。
5. 合规性与报告
  • 法规遵守: 许多行业法规要求记录和保留日志以证明信息系统的安全性和完整性。
  • 审计跟踪: 日志为系统的修改和访问提供了一个可审计的历史记录,这在发生安全事件时尤为重要。
6. 系统管理
  • 状态监控: 定期记录系统状态的日志可以帮助系统管理员了解系统的健康状况。
  • 配置变更: 记录关键系统配置的更改,帮助跟踪系统变更的历史和影响。
7. 客户支持
  • 问题重现: 日志可以帮助技术支持团队重现和解析客户遇到的问题,提高解决问题的效率。
  • 服务质量: 日志分析可以帮助识别服务中断或质量下降的原因,从而改进服务。
8. 数据恢复
  • 操作记录: 在出现数据丢失或破坏的情况下,日志可以提供重要信息帮助恢复数据。

三、日志各个字段的含义

2023-09-22 14:32:45.123 INFO [http-nio-8080-exec-10] com.example.myapp.UserController - Successfully logged in user [userID=42] from IP 192.168.1.25

这条日志包含了多个重要字段,我们逐一解析:

1. 时间戳(Timestamp)
  • 值: 2023-09-22 14:32:45.123
  • 含义: 这是日志事件发生的确切日期和时间,精确到毫秒。
  • 用途: 这可以帮助我们了解事件发生的具体时间,对于系统故障发生的时间轴分析非常关键。
2. 日志级别(Log Level)
  • 值: INFO
  • 含义: 这表示日志消息的级别是信息级别,通常用于记录正常的操作信息。
  • 用途: 通过日志级别,我们可以快速筛选出错误、警告或其他关键信息,本例中 INFO 级别说明是常规操作信息。
3. 日志来源(Logger Name/Source)
  • 值: com.example.myapp.UserController
  • 含义: 这表示生成日志的类是 UserController
  • 用途: 让我们知道这条日志是从应用程序的哪个部分生成的,有助于快速定位问题相关的代码或组件。
4. 消息(Message)
  • 值: Successfully logged in user [userID=42] from IP 192.168.1.25
  • 含义: 描述了发生的具体事件,即用户成功登录。
  • 用途: 提供了操作的具体详情,是理解和诊断问题的关键信息。
5. 线程名(Thread Name)
  • 值: http-nio-8080-exec-10
  • 含义: 表示处理当前请求的线程名称。
  • 用途: 在并发环境中,线程名可以帮助我们识别和追踪处理特定请求的线程,对于调试和优化多线程处理非常有用。
6. 用户ID(User ID)
  • 值: userID=42
  • 含义: 标识执行操作的用户。
  • 用途: 在安全审计和用户行为分析中非常重要,用于追踪和记录特定用户的操作。
7. IP 地址(IP Address)
  • 值: 192.168.1.25
  • 含义: 用户请求来源的 IP 地址。
  • 用途: 用于识别请求来源,对于安全分析和地理位置追踪等场景非常有用。

四、slf4j的门面模式

SLF4J(Simple Logging Facade for Java)是一个日志门面,提供了一种简单的抽象层,允许开发者在底层使用不同的日志框架,如 Logback、Log4J 或 JUL(Java Util Logging)。使用 SLF4J 有助于解耦应用代码和具体的日志实现库,从而使得更换日志实现或与其他依赖库整合时更加方便和灵活。

四、SLF4J与门面模式

门面(Facade)模式是一种常用的软件设计模式,其主要目的是提供一个统一的高级接口来隐藏系统的复杂性,使得系统更加容易使用。在 SLF4J 的上下文中,门面模式的应用使得开发者可以通过一套统一的API(SLF4J API)编写日志语句,而不用关心具体的日志框架实现。

SLF4J的工作方式
  1. 统一API:SLF4J 提供了一组日志接口,如 LoggerLoggerFactory,开发者通过这些接口编写日志语句。
  2. 绑定到具体实现:在应用的类路径中,必须提供一个 SLF4J 的绑定,该绑定负责将 SLF4J 的调用桥接到底层的日志框架(如 Logback 或 Log4J)。
  3. 日志实现:除了 SLF4J 绑定之外,还需要在类路径中提供具体的日志框架实现,这是实际执行日志记录操作的库

在使用 Spring Boot 构建 Spring Web 项目时,你通常不需要手动引入新的日志依赖,因为 Spring Boot 自带了对日志的全面支持。默认情况下,Spring Boot 使用 SLF4J 作为日志门面,并且内置了 Logback 作为日志实现。这意味着你可以直接在应用程序中使用 SLF4J 的日志API进行日志记录,而无需关心具体的日志实现细节。

默认的日志配置

Spring Boot 的 spring-boot-starter-web 依赖包括了 spring-boot-starter-logging,它配置了以下内容:

  • SLF4J:作为日志抽象层。
  • Logback:作为日志实现(默认配置)。
  • Jul-to-SLF4J:Java Util Logging(JUL)到 SLF4J 的桥接。
  • JCL-to-SLF4J:Jakarta Commons Logging(JCL)到 SLF4J 的桥接。
  • Log4j-to-SLF4J:Log4j 到 SLF4J 的桥接。

由于 SLF4J 已经被 Spring Boot 配置好了,

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Example {private static final Logger logger = LoggerFactory.getLogger(Example.class);public void doSomething() {logger.debug("Doing something...");try {// 假设的业务逻辑} catch (Exception e) {logger.error("An error occurred while doing something", e);}}
}

你可以直接在你的代码中使用它来记录日志,例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Example {private static final Logger logger = LoggerFactory.getLogger(Example.class);public void doSomething() {logger.debug("Doing something...");try {// 假设的业务逻辑} catch (Exception e) {logger.error("An error occurred while doing something", e);}}
}

五、日志级别

日志级别是用来指示日志记录的重要性和紧急程度的一个机制。在日志系统中设置适当的日志级别可以帮助开发者更有效地过滤和管理日志信息,确保只记录关键的数据,同时避免不必要的信息干扰。常见的日志级别,按照从最低到最高的严重性排序,通常包括以下几种:

1. TRACE
  • 含义:这是最详细的日志级别,用于记录极其详细的事件信息,通常用于问题诊断中的细粒度分析。
  • 使用场景:在调试复杂的问题时,你可能需要开启 TRACE 级别来获取执行的每一个步骤和变量的状态。
2. DEBUG
  • 含义:用于记录调试信息,比 TRACE 级别略高,提供的信息足以跟踪程序的执行流程但不如 TRACE 级别详细。
  • 使用场景:在开发环境中常用此级别来查看程序运行状态,帮助开发者理解程序行为或定位问题的原因。
3. INFO
  • 含义:用来记录程序的一般信息,如程序启动/停止、用户操作等,这些信息通常是你想要在生产环境中看到的。
  • 使用场景:用于记录程序的运行状态或者重要的业务操作,通常这些信息是对系统管理员或者最终用户有用的。
4. WARN
  • 含义:表示潜在的问题或者不寻常的情况,虽然不一定影响系统的功能,但值得注意。
  • 使用场景:用于记录不正常但不影响系统继续运行的事件,比如配置文件的缺失、数据格式的错误等。
5. ERROR
  • 含义:记录错误事件,这些错误会影响系统的某些功能,但系统还能继续运行。
  • 使用场景:用于记录那些需要立即关注的问题,如运行时异常、API 调用失败等。
6. FATAL
  • 含义:非常严重的错误,可能会导致应用程序停止运行。
  • 使用场景:只有在最糟糕的情况下,比如系统崩溃或关键组件无法加载时,才使用此级别。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32残疾人辅助行走系统

要么是家人陪伴&#xff0c;要么是类似导盲犬的动物辅助&#xff0c;家人还有事要做&#xff0c;不一定实时在场&#xff0c;而动物辅助也可能会出现新的问题&#xff0c;威胁残疾人身体安全。因此利用现代计算机技术、传感器检测设备和物联网技术设计这一款辅助残疾人行走的智…

【FPGA】FPGA芯片结构

目录 1 可编程输出/输出单元&#xff08;IOB&#xff09;2 可配置逻辑块&#xff08;CLB&#xff09;3 数字时钟管理模块&#xff08;DCM&#xff09;4 嵌入式块存储器&#xff08;BRAM&#xff09;5 布线资源6 内嵌功能模块&#xff08;专用IP单元&#xff09;6.1 PLL&#xf…

MISC - 第一天(stegsolve图片隐写解析器、QR research、binwalk,dd文件分离,十六进制文件编辑器)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;最近更新Buuctf在线测评中的MISC杂项内容 介绍 BUUCTF:https://buuoj.cn/ &#xff0c;整合了各大 CTF 赛事题目&#xff0c;类型丰富&#xff0c;涵盖了Web 安全、密码学、系统安全、逆向工程、代码审计等多个领域 …

C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

数据库 MySQL 是否需要容器化?

容器的定义&#xff1a;容器是为了解决“在切换运行环境时&#xff0c;如何保证软件能够正常运行”这一问题。 目前&#xff0c;容器和 Docker 依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以…

2024PHP彩虹工具网源码一个多功能工具箱程序支持72种常用站长和开发等工具

安装&#xff1a; PHP>7.4 伪静态设置Thinkphp 设置/public为网站运行目录 访问你的域名/install进行安装即可 安装扩展 sg11 &#xff0c;fileinfo &#xff0c; ionCube 常用功能 站长工具&#xff1a;ICP备案查询、IP地址查询、域名Whios查询、腾讯域名拦截查询、Mysql…

基于yolov5的中国交通标志TT100K检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的中国交通标志TT100K检测系统是一种利用深度学习技术实现高效、准确交通标志识别的系统。该系统采用YOLOv5作为核心检测算法&#xff0c;凭借其速度快、准确性高的特点&#xff0c;在实时交通标志识别领域展现出显著优势。 TT100K数据集作为该系统的…

调用本地大模型服务出现PermissionDeniedError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ICM20948 DMP代码详解(38)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;37&#xff09; 上一回继续解析inv_icm20948_set_slave_compass_id函数&#xff0c;解析了第3段代码&#xff0c;本回解析接下来的代码。为了便于理解和回顾&#xff0c;再次贴出该函数源码&#xff0c;在EMD-Core\so…

PMP--二模--解题--71-80

文章目录 13.干系人管理--干系人登记册--记录干系人的身份信息、评估信息、干系人分类。识别完干系人更新干系人登记册。71、 [单选] 一名初级项目经理被指派到一个新启动的项目&#xff0c;高级项目经理指示该初级项目经理去识别在项目中享有既得利益的人员。高级项目经理让初…

Python OpenCV精讲系列 - 高级图像处理技术(十)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

社区团购的创新与变革——融合开源链动 2+1 模式、AI 智能名片及 S2B2C 商城小程序

摘要&#xff1a;本文从信息流、资金流、物流角度深入分析社区团购的特点&#xff0c;探讨其如何避免传统线下中心零售的高展示成本与传统电商的高交付成本。同时&#xff0c;引入开源链动 21 模式、AI 智能名片及 S2B2C 商城小程序等创新元素&#xff0c;阐述它们为社区团购带…

Card View 卡片视图

Goto 数据网格和视图入门 Card View 卡片视图 The Card View displays data records as cards, arranged down and then across. Card fields are always arranged in a single column. The Card View is represented by the CardView class. Card View &#xff08;卡片视图…

k8s中pod的创建过程和阶段状态

管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录&#xff0c;也可以用证书登录 k8s只能用证书登录 谁拿到这个证书&#xff0c;谁就可以管理集群 在k8s中&#xff0c;所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…

计算机毕业设计springboot+vue高校教学实施评教系统springcloud微服务分布式

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

linux强制关闭再启动后zookeeper无法启动

1、若开启了zkserver就先关闭zkserver 查看zkserver是否启动 sh zkServer.sh status关闭zkServer sh zkServer.sh stop2、更改conf/zoo.cfg 将这里的启动端口改为2183 3、启动zkServer sh zkServer.sh start4、以2183端口启动zkCli zkCli.sh -server 127.0.0.1:2183这样启…

华为OD机试 - N个选手比赛前三名、比赛(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

恶意AI大模型的兴起将改变网络安全

LLM 的恶意版本&#xff08;如 ChatGPT 的黑暗变体&#xff09;的兴起正在通过使用更复杂和自动化的攻击来升级网络战。 这些模型可以生成令人信服的网络钓鱼电子邮件、传播虚假信息并制作有针对性的社会工程消息。 所有这些非法功能都对在线安全构成了重大威胁&#xff0c;并加…

水果识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 水果识别系统。本项目使用Python作为主要编程语言&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的5种常见的水果&#xff08;圣女果、梨、芒果、苹果、香蕉&#xff09;等图片数据集进行训练&#xff0c;最终得到一个识别精度较高的模…

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 048 &#xff0c;文末自助获取源码 \color{red}{T048&#xff0c;文末自助获取源码} T048&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…