详细介绍一下Spring Boot中的日志操作框架?
ztj100 2024-12-26 17:44 13 浏览 0 评论
在实际开发中,日志作为应用不可或缺的一部分成为了解决问题的关键解决步骤。通过日志开发者可以快速的定位问题、查找问题、还可以对应用的运行情况进行监控。而在Spring Boot应用框架中提供多种的日志处理库,可以提供开发者自由选择各种的日志处理方式,下面我们就来总结一下在Spring Boot中常用的日志处理框架。
Spring Boot 中的日志框架概览
在Spring Boot中默认使用的是SLF4J(Simple Logging Facade for Java)日志框架,配合着Logback框架作为日志的具体实现。因为在SLF4J框架中只是提供了一套统一的日志处理接口接口,而Logback框架则是SLF4J框架默认的具体实现,在Logback中提供了各种丰富的日志操作,如日志级别、格式化、异步日志等,方便开发者在配置日志中使用。
主要日志框架
除了上面的默认的日志框架之外,我们还可以使用如下的一些日志框架。
- Log4j2:一个性能优化较高的日志框架,相比于Logback,Log4j2在某些高负载场景下性能更好,且支持更多的日志输出目标,例如可以输出到数据库、文件等。
- Java Util Logging (JUL):这个是在Java中自带的日志处理框架,在Spring Boot中同样我们也可以使用该框架,但是这个框架没有Logback或Log4j2强大,所以一般在开发中很少使用。
Spring Boot 默认日志配置
在Spring Boot中,默认的日志框架是SLF4J + Logback。而在Spring Boot中默认是支持了这两个框架,我们只需要添加spring-boot-starter-logging日志处理框架即可, 如下所示。当然如果没有显式替换过日志框架,在Spring Boot应用中默认引用的也是这个依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
日志记录
既然Spring Boot中,默认使用的是SLF4J框架进行的日志管理,那么下面我们就来看看如何通过这个日志框架来实现日志记录操作。
常见日志等级介绍,常见的日志等级分为了六个等级,等级从高到底依次如下所示。
- TRACE:最详细的日志,通常用于调试。
- DEBUG:用于开发调试,通常用于显示开发过程中较为详细的信息。
- INFO:用于输出一些重要的信息,通常用于系统正常运行时的状态信息。
- WARN:警告级别,表示可能存在问题的情况,但不影响程序运行。
- ERROR:错误级别,表示程序发生了错误,通常需要开发人员处理。
- FATAL:非常严重的错误,通常会导致应用程序崩溃。
在代码实现中,我们可以通过如下的方式来实现日志的记录操作。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void performAction() {
logger.trace("This is a TRACE log");
logger.debug("This is a DEBUG log");
logger.info("This is an INFO log");
logger.warn("This is a WARN log");
logger.error("This is an ERROR log");
}
}
在实际开发中,对于日志输出级别的调整主要取决于实际应用中的需求,在开发阶段我们一般使用的是DEBUG和TRACE级别的日志输出,便于定位和查找问题。而在生产环境中我们一般只记录INFO级别以上的日志,因为在服务器上日志过多会影响服务器存储。而对于异常日志测试采用ERROR级别的日志进行输出,这样方便在后续线上应用问题定位中快速的找到出错的位置。
日志配置
在Spring Boot中默认使用了Logback作为日志的实现,也就是说在不做任何的配置的情况下,就会使用默认的日志配置方式来进行输出,也就是默认将日志输出到控制台中,然后使用的日志格式也是系统默认的日志格式。
当然在实际场景中,我们可以通过使用application.yml配置文件来对日志操作进行调整,如下所示,可以调整日志格式、日志级别、日志处理文件等。
logging:
level:
root: INFO
org.springframework.web: DEBUG
com.example: TRACE
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
file:
name: logs/app.log
max-size: 10MB
max-history: 30
当然我们也可以对Logback的日志配置来进行调整,我们可以在resource目录下创建logback-spring.xml或logback.xml来进一步控制日志行为,如下所示。
<configuration>
<!-- 定义日志输出格式 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
</appender>
<!-- 定义日志输出文件 -->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>logs/app.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置日志级别和输出源 -->
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
<!-- 特定包的日志级别 -->
<logger name="org.springframework" level="DEBUG"/>
</configuration>
通过这种方式,我们可以控制日志的输出格式、输出文件、输出日志策略等操作。
集成其他日志框架
如果觉得Logback日志框架不好用,我们也可以将其替换成Log4j2框架,如下所示,首先需要从POM文件中排除spring-boot-starter-logging,并添加Log4j2的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
然后再resource目录中添加log4j2.xml配置文件,内容如下所示。
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
当然我们还可以使用其他的日志处理框架,这里建议使用默认的框架或者是Log4j2,因为这两个都是久经考验的日志框架。
日志文件管理
在上面的配置中我们提到了一个日志滚动机制,通过日志滚动机制我们可以实现自动日志文件的切分这样可以防止应用程序日志太大不便于查询,我们可以通过如下的方式来配置日志滚动策略。
logging.file.name=logs/app.log
logging.file.max-size=10MB
logging.file.max-history=30
通过这样的配置,我们可以控制文件的数量以及大小,这样我们可以通过定时任务来清理过期的日志文件,保证不会出现日志文件过大占用磁盘导致应用程序相应过慢的问题。
总结
在Spring Boot中默认就提供了一个功能强大的日志处理机制,通过自动的日志配置可以快速实现日志管理操作,当然在实际使用场景中,我们可以对日志控制机制进行扩展,例如可以将日志写入到ElasticSearch中或者是写入的Kafka中进行进一步的日志分析处理。
相关推荐
- Sublime Text 4 稳定版 Build 4113 发布
-
IT之家7月18日消息知名编辑器SublimeText4近日发布了Build4113版本,是SublimeText4的第二个稳定版。IT之家了解到,SublimeTe...
- 【小白课程】openKylin便签贴的设计与实现
-
openKylin便签贴作为侧边栏的一个小插件,提供便捷的文本记录和灵活的页面展示。openKylin便签贴分为两个部分:便签列表...
- 壹啦罐罐 Android 手机里的 Xposed 都装了啥
-
这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的App。文章将以「每周一篇」的频率更新,内容范围会包括iOS、...
- 电气自动化专业词汇中英文对照表(电气自动化专业英语单词)
-
专业词汇中英文对照表...
- Python界面设计Tkinter模块的核心组件
-
我们使用一个模块,我们要熟悉这个模块的主要元件。如我们设计一个窗口,我们可以用Tk()来完成创建;一些交互元素,按钮、标签、编辑框用到控件;怎么去布局你的界面,我们可以用到pack()、grid()...
- 以色列发现“死海古卷”新残片(死海古卷是真的吗)
-
编译|陈家琦据艺术新闻网(artnews.com)报道,3月16日,以色列考古学家发现了死海古卷(DeadSeaScrolls)新残片。新出土的羊皮纸残片中包括以希腊文书写的《十二先知书》段落,这...
- 鸿蒙Next仓颉语言开发实战教程:订单列表
-
大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆。今天要分享的是仓颉语言开发商城应用的订单列表页。首先来分析一下这个页面,它分为三大部分,分别是导航栏、订单类型和订单列表部分...
- 哪些模块可以用在 Xposed for Lollipop 上?Xposed 模块兼容性解答
-
虽然已经有了XposedforLollipop的安装教程,但由于其还处在alpha阶段,一些Xposed模块能不能依赖其正常工作还未可知。为了解决大家对于模块兼容性的疑惑,笔者尽可能多...
- 利用 Fluid 自制 Mac 版 Overcast 应用
-
我喜爱收听播客,健身、上/下班途中,工作中,甚至是忙着做家务时。大多数情况下我会用MarcoArment开发的Overcast(Freemium)在iPhone上收听,这是我目前最喜爱的Po...
- 浅色Al云食堂APP代码(三)(手机云食堂)
-
以下是进一步优化完善后的浅色AI云食堂APP完整代码,新增了数据可视化、用户反馈、智能推荐等功能,并优化了代码结构和性能。项目结构...
- 实战PyQt5: 121-使用QImage实现一个看图应用
-
QImage简介QImage类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘制设备。QImage是QPaintDevice子类,因此可以使用QPainter直接在图...
- 滚动条隐藏及美化(滚动条隐藏但是可以滚动)
-
1、滚动条隐藏背景/场景:在移动端,滑动的时候,会显示默认滚动条,如图1://隐藏代码:/*隐藏滚轮*/.ul-scrool-box::-webkit-scrollbar,.ul-scrool...
- 浅色AI云食堂APP完整代码(二)(ai 食堂)
-
以下是整合后的浅色AI云食堂APP完整代码,包含后端核心功能、前端界面以及优化增强功能。项目采用Django框架开发,支持库存管理、订单处理、财务管理等核心功能,并包含库存预警、数据导出、权限管理等增...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)