从零开始 Spring Boot 34:日志 II

news2024/11/26 0:27:10

从零开始 Spring Boot 34:日志 II

spring boot

图源:简书 (jianshu.com)

在从零开始 Spring Boot 10:日志 - 红茶的个人站点 (icexmoon.cn)中,我简单介绍过如何在Spring Boot中整合SLF4J日志。实际上,如果没有特殊需求,完全可以不使用第三方日志,就使用Spring Boot的默认日志功能,这样在配置上会省很多事。下面介绍Spring Boot默认使用的 logback 日志功能。

日志格式

Spring Boot的默认的日志输出格式类似于下面的例子:

2023-03-03T21:18:18.827+08:00  INFO 19388 --- [           main] o.s.b.d.f.s.MyApplication                : Starting MyApplication using Java 17 with PID 19388 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2023-03-03T21:18:18.834+08:00  INFO 19388 --- [           main] o.s.b.d.f.s.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2023-03-03T21:18:20.439+08:00  INFO 19388 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-03-03T21:18:20.461+08:00  INFO 19388 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-03T21:18:20.461+08:00  INFO 19388 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-03-03T21:18:20.600+08:00  INFO 19388 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-03T21:18:20.602+08:00  INFO 19388 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1685 ms
2023-03-03T21:18:21.078+08:00  INFO 19388 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-03-03T21:18:21.093+08:00  INFO 19388 --- [           main] o.s.b.d.f.s.MyApplication                : Started MyApplication in 2.998 seconds (process running for 3.601)

输出内容包含以下项目:

  • Date和时Time:精确到毫秒,易于排序。
  • 日志级别: ERROR, WARN, INFO, DEBUG, 或 TRACE.
  • 进程ID。
  • 一个 --- 分隔符,以区分实际日志信息的开始。
  • 线程名称:包含在方括号中(对于控制台输出可能会被截断)。
  • 记录器名称:这通常是源类的名称(通常是缩写)。
  • 日志消息。

控制台输出

默认情况下,日志会输出 ERRORWARNINFO 级别的消息到控制台。 你也可以通过用 --debug 标志启动你的应用程序,来启用 debug 模式。

$ java -jar myapp.jar --debug

你也可以在你的 application.properties 中指定 debug=true

另外,你可以通过在启动应用程序时使用 --trace 标志(或在 application.properties 中使用 trace=true )来启用 “trace” 模式。 这样做可以对一些核心记录器(嵌入式容器、Hibernate schema生成和整个Spring组合)进行跟踪记录。

在实际工作中,通常会选择在开发环境尽可能多输出信息,所以可以选择在application-dev.properties中配置:

debug=true
trace=true

application-test.properties中配置:

debug=true

多环境部署的内容可以参考从零开始 Sping Boot 20:多环境部署 - 红茶的个人站点 (icexmoon.cn)。

彩色输出

默认情况下,Spring Boot会检测控制台是否支持ANSI进行彩色输出,如果支持,输出到控制台的日志就是彩色的。这种行为可以通过配置项spring.output.ansi.enabled进行修改:

  • spring.output.ansi.enabled=always,总是输出ANSI彩色信息。
  • spring.output.ansi.enabled=never,不输出彩色信息。
  • spring.output.ansi.enabled=detect,自动检测。

要说明的是,这种行为不会影响到IDE,即使设置了spring.output.ansi.enabled=never,你依然会看到彩色输出。但通过控制台运行应用(java -jar xxx)时,控制台会受到影响:

image-20230523105748352

image-20230523105802342

输出到文件

默认情况下Spring Boot不会输出日志到文件,可以通过以下配置项开启:

logging.file.path=logs

这样设置以后日志会保存在当前工作目录下的logs目录下。当然你也可以指定绝对路径,比如/var/xxx/log

日志文件在达到10MB时就会轮换,与控制台输出一样,默认情况下会记录 ERRORWARN 级和 INFO 级别的信息。

文件轮换(滚动日志)

默认情况下,日志文件会在达到10MB的时候进行分割,分割后的日志文件会被打包成.gz文件保存:

image-20230523113815844

可以通过以下配置来修改分割日志文件时的大小:

logging.logback.rollingpolicy.max-file-size=1KB

单位可以是KB\MB\GB等。

默认情况下日志轮转发生在每天的午夜时分(24:00),可以通过以下属性控制日志轮转后保留的历史日志文件数目:

logging.logback.rollingpolicy.max-history=5
  • 默认是7
  • 分割日志不等同于日志轮转,实际测试发现分割日志时并不会触发轮转,比如当你设置轮转时最大文件大小为1KB,当日志文件超过1KB时,就会分割文件,但此时并不会进行轮转,所以max-history属性是失效的,分割的日志文件数量会无限增长,直到午夜时分进行轮转以清除历史日志文件。

理论上可以通过设置轮转日志文件命名规则来设置轮转触发时间,比如:

logging.logback.rollingpolicy.file-name-pattern=logs/rollingpolicy/myapplication.%d{yyyy-MM}.log

logback可以识别file-name-pattern中的%d{yyyy-MM},所以示例中的轮转会以月为单位触发(默认是%d{yyyy-MM-dd},因此以日为单位轮转)。

之所以说是“理论上”,是因为我实际测试发现只要设置了file-name-pattern属性,整个Spring Boot的日志输出都会失效,不会再产生任何日志文件。我不清楚这是否是某个版本的bug,翻阅了logback的相关网页后并没有找到解决方案。

  • 关于logback的file-name-pattern属性,可以参考Chapter 4: Appenders (qos.ch)。
  • 实际上我们也并不是只能借助file-name-pattern来整理和归档日志,如果服务是部署在Linux服务器,完全可以自己编写Shell脚本来对日志进行归档和处理,这样归档的时间、存放目录结构以及打包和压缩都可以很自由地进行定制。Shell脚本的编写可以参考Linux 之旅 10:Shell 脚本 - 红茶的个人站点 (icexmoon.cn)。

日志级别

可以使用logging.level.<logger-name>=<level>的方式设置包的日志级别,比如:

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.com.example.log=debug

可以设置的日志级别包括:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, 或 OFF

示例中的logging.level.root是根记录器(root logger)。

日志组

有时候我们希望一次性设置多个包的日志级别,这时候就可以使用日志组(log group),将这多个包设置为一个日志组,然后针对这个日志组设置日志级别,比如:

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace

Spring Boot 已经预定义了一些日志组:

组名组中的logger
weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

扩展日志

如果需要对日志进行更高级别的设置,可以选择扩展Logback或者Log4j2,具体方式可以参考:

  • Logback 扩展 (springdoc.cn)
  • Log4j2 扩展 (springdoc.cn)
  • 从零开始 Spring Boot 10:日志 - 红茶的个人站点 (icexmoon.cn)

The End,谢谢阅读。

本文的完整示例可以通过learn_spring_boot/ch34/log · GitHub获取。

参考资料

  • 从零开始 Sping Boot 20:多环境部署 - 红茶的个人站点 (icexmoon.cn)
  • 日志 (springdoc.cn)
  • Chapter 4: Appenders — 第四章:附录 (qos.ch)
  • SpringBoot Logback 日志配置 - 知乎 (zhihu.com)

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

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

相关文章

开发一套pacs系统主要解决的问题有哪些?

PACS的定义 PACS&#xff08;picture archiving and communication system&#xff09;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&…

MySQL---锁机制

1. 锁的分类 从对数据操作的粒度分 &#xff1a; 表锁&#xff1a;操作时&#xff0c;会锁定整个表。 行锁&#xff1a;操作时&#xff0c;会锁定当前操作行。 从对数据操作的类型分&#xff1a; 读锁&#xff08;共享锁&#xff09;&#xff1a;针对同一份数据&#xff…

ChatGPT与低代码开发:危机四伏、技术暴走!

随着人工智能技术和低代码开发平台的不断发展&#xff0c;越来越多的企业开始采用AI技术来提高业务效率和创造更好的用户体验。AI技术与低代码开发的结合&#xff0c;为企业节省了大量时间和成本&#xff0c;同时也提高了业务创新和竞争力。然而&#xff0c;一些潜在的问题也开…

关于怎么用好API接口获取更多信息节约时间成本

API接口是现代互联网应用开发的重要工具&#xff0c;它允许开发者使用标准化的方式获取数据和服务&#xff0c;在搭建应用中扮演了重要的角色。因此&#xff0c;如何利用API接口获取更多信息已经成为了每个开发者需要掌握的技能之一。 第一步&#xff1a;寻找 API接口 在开始…

2023Revit精装模块,一键搞定便捷精装!

大家好&#xff0c;这里是BIM建模助手。 今天有个重磅消息要告诉大家&#xff0c;那就是BIM建模助手的【精装模块】上线啦&#xff01; 为了辅助BIMer快速设计出精装修的房屋效果&#xff0c;我们开发了【精装模块】&#xff0c;无论是装饰面层、铺排瓷砖、布置吊顶、统计出量…

​​​​​​​博物馆文物馆藏环境空气质量无线监控系统方案

博物馆文物馆藏环境空气质量无线监控系统方案 博物馆无线环境测控系统 博物馆恒温恒湿消毒净化系统 现代化博物馆空气质量一体化3D可视化管控平台 博物馆温湿度在线监控系统 博物馆光照在线监控系统 博物馆二氧化碳在线监控系统 博物馆在线监控系统 博物馆紫外线在线监控…

【TikZ 简单学习(下):基础绘制】Latex下的绘图宏包

【TikZ 简单学习[下]&#xff1a;基础绘制】Latex下的绘图宏包 上文绘制多个节点给节点添加统一样式给节点命名使用相对位置绘制给节点标签链接边的绘制在线边上添加标签绘制蛇形线和多行文本层图绘制一个简单的树 上文 【TikZ 简单学习(上)&#xff1a;基础绘制】Latex下的绘…

【笔试强训选择题】Day19.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

深度学习神经网络学习笔记-多模态方向-11-Deep Voice: Real-time Neural Text-to-Speech

摘要 本文提出Deep Voice&#xff0c;一种完全由深度神经网络构建的生产质量文本到语音系统。Deep Voice为真正的端到端神经语音合成奠定了基础。该系统由五个主要的构建模块组成:用于定位音素边界的分割模型、字素到音素的转换模型、音素时长预测模型、基频预测模型和音频合成…

那年我手执『wait』桃木剑,轻松解决僵尸进程~

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;进程退出&#x1f426;进程常见的退出方法&#x1f414;正常终止&#x1f514;return 退出&#x1f514;exit 退出&#x1f514;_exit 退出 &#x1f414;异常终止 &#x1f427;进程等待&#x1f426;必要性…

00后实在太卷了,跳槽到我们公司起薪20k,都快超过我了....

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和…

美股股指期货是什么?有哪些美股股指期货交易门槛?

美股期指就是美股期货指数&#xff0c;并不是单独的指道琼斯还是纳斯达克&#xff0c;就好像中国的股指期货一样道理&#xff0c;是以沪深300为标的的&#xff0c;美股期指也是期货&#xff0c;不是单纯的指数。交易美股产品需要先完成开户&#xff0c;要想一次性开户成功就要满…

2023.4月及5月最新HCIP 考试战报来袭

2023年HCIP/CCNP考试战报_微思xmws的博客-CSDN博客国内企业或国企、事业单位&#xff0c;华为设备普及&#xff0c;国内未来发展趋势&#xff0c;考华为认证更被认可。如果你在外企上班或有出国打算&#xff0c;推荐考思科。https://blog.csdn.net/XMWS_IT/article/details/129…

【隔空投送】2023新品,加速科技ST2500E重磅来袭

随着5G通信、人工智能、虚拟现实、新能源以及先进封装技术的飞速发展&#xff0c;芯片线宽尺寸不断减小&#xff0c;芯片复杂度不断跃升&#xff0c;对测试机的要求愈加提高。提供多种测试程序并可进行大量的并行测试&#xff0c;有效减少测试成本&#xff0c;缩短产品上市时间…

Paddle 模型转 TensorRT加速模型

Paddle 模型转 TensorRT加速模型 概述 NVIDIA TensorRT 是一个高性能的深度学习预测库&#xff0c;可为深度学习推理应用程序提供低延迟和高吞吐量。PaddlePaddle 采用子图的形式对TensorRT进行了集成&#xff0c;即我们可以使用该模块来提升Paddle模型的预测性能。在这篇文章…

Ubuntu显示时间不正确的问题解决

安装完ubuntu后&#xff0c;发现我的ubuntu显示的时间不对&#xff0c;和网络的时间根本对不上。网上查找了相关设置方法&#xff0c;这里总结一下。 一般来说&#xff0c;显示时间不正确的情况就两种情况&#xff0c;第一&#xff1a;是你系统设置的时区不对&#xff1b;第二…

多层感知机学习XOR实例

多层感知机学习XOR实例 多层感知机介绍使用多层感知机学习XOR实例传统统计数学方法&#xff08;传统机器学习&#xff09;使用多层感知机学习XOR 总结 多层感知机介绍 多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;又称为深度前馈网络…

Compose 二三事:绘制原理

setContent做了什么 我们基于一个最简单的例子进行分析 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {Text(text "Hello World!")}} }这里setContent做了什么…

【Jmeter入门】使用Jmeter做接口测试

目录 一、Jmeter简介 二、Jmeter相关插件安装&#xff1a; 三、Jmeter运行模式及参数 四、Jmeter函数 五、Jmeter属性与变量 六、Jmeter如何做接口测试 【1】、Jmeter 的使用步骤 【2】、接口请求实例 1. “用户定义的变量” 的应用 3. 建立接口间的关联 4…

Gaussian量子化学计算、LAMMPS分子动力学模拟

Gaussian是做半经验计算和从头计算使用最广泛的量子化学软件&#xff0c;可研究诸如分子轨道&#xff0c;结构优化&#xff0c;过渡态搜索&#xff0c;热力学性质&#xff0c;偶极矩和多极矩&#xff0c;电子密度和电势&#xff0c;极化率和超极化率&#xff0c;红外和拉曼光谱…