在Spring Boot中使用不同的日志
前言,本篇就是介绍在Java中使用相关的日志,适合初学者看,如果对这篇不感兴趣的可以移步了,本篇主要围绕我们Java中的几种日志类型,也说不上有多深入,算的上浅入浅出吧,如果你有一段时间的开发经验或者以及学过日志了,其实这篇文章对你并无太大用处。
说到日志,这玩意就很重要了,我们在实际开发中或者我们在做项目的时候,我们一般查找问题往日志查看,包括我们上线的项目,如果项目出现什么问题了,那我们第一件事情,就是下载项目运行日志,然后根据日志来判断程序在哪里出现了问题。目前Java中提供的日志有以下几种类型:
- JDK Logging: JDK自带的日志框架,也是Java官方推荐的日志框架,可以通过java.util.logging包来使用。
- Log4j:Apache开源的日志框架,提供了丰富的配置选项和灵活的日志输出方式,可以通过log4j包使用
- Logback:Log4j的升级版,也是由Apache开源的日志框架,提供了更好的性能和更加丰富的功能,可以通过logback包来使用。
- SLF4J:Simple Logging Facade for Java,是一个抽象层,可以在不同的日志框架之间进行切换,可以通过slf4j包来使用。
接下来我们将采用这些案例进行demo日志打印:
第一个引入相关依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.32</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version><scope>compile</scope></dependency>
配置了相关依赖之后,咱们来配置我们的相关配置文件:
#端口号
server.port=9091
#开启应用调试模式
debug=true
#debug展示包以下的记录的日志级别为debug
logging.level.com.miaow=debug# 而logging.logback.rollingpolicy是Logback日志框架的滚动策略配置
# clean-history-on-start表示是否在应用程序启动时清除历史日志文件,默认为false。
logging.logback.rollingpolicy.clean-history-on-start=false
# file-name-pattern表示日志文件名的格式,默认为%d{yyyy-MM-dd}/%i.log,其中%d{yyyy-MM-dd}表示按照日期划分日志文件,%i表示日志文件的序号。
logging.logback.rollingpolicy.file-name-pattern=
#max-history表示保留的历史日志文件的最大数量,默认为7。
logging.logback.rollingpolicy.max-history=7
# max-file-size表示单个日志文件的最大大小,默认为10MB。
logging.logback.rollingpolicy.max-file-size=10MB
# total-size-cap表示所有日志文件的总大小上限,默认为0B,表示没有上限。
logging.logback.rollingpolicy.total-size-cap=0B
需要注意的是,logging.logback.rollingpolicy是Logback的配置项,如果您使用的是其他日志框架,可能需要使用不同的配置项。
也可以:
logging:level:root: infocom.example: debugfile:name: myapp.logpath: /var/log/myapp/
上面的配置表示将根日志级别设置为info,将com.example包下的日志级别设置为debug,并将日志输出到/var/log/myapp/myapp.log文件中。
咱们创建四个类表示以上的四种日志方式:
import java.util.logging.Logger;/*** @date 2023年11月29日 14:52* @description*/
public class MyClass1 {private static final Logger LOGGER = Logger.getLogger(MyClass1.class.getName());public void myMethod() {LOGGER.info("============>JDK Logging<============");LOGGER.info("This is an info message");LOGGER.warning("This is a warning message");LOGGER.severe("This is a severe message");}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass3 {private static final Logger LOGGER = LoggerFactory.getLogger(MyClass3.class);public void myMethod() {LOGGER.info("================>Logback<================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass4 {private static final Logger LOGGER = LoggerFactory.getLogger(MyClass4.class);public void myMethod() {LOGGER.info("===============>SLF4J<=================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
import org.apache.log4j.Logger;
/*** @date 2023年11月29日 14:53* @description*/
public class MyClass5 {private static final Logger LOGGER = Logger.getLogger(MyClass5.class);public void myMethod() {LOGGER.info("==============>Log4j<==================");LOGGER.info("This is an info message");LOGGER.warn("This is a warning message");LOGGER.error("This is an error message");}
}
然后我们在Spring Boot中启动类中配置:
@Slf4j
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);MyClass1 m1 = new MyClass1();MyClass5 m2 = new MyClass5();MyClass3 m3 = new MyClass3();MyClass4 m4 = new MyClass4();m1.myMethod();m2.myMethod();m3.myMethod();m4.myMethod();}
}
如果你到这一步就以为结束了?
你不妨启动一下项目,我们发现MyClass5好像没生效,并且控制台报错了:
log4j:WARN No appenders could be found for logger
(org.apache.ibatis.logging.LogFactory).log4j:WARN Please initialize the log4j system properly. log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
我们发现问题出在,我们需要在Resources目录下建立一个log4j.properties文件
# Global logging configuration 开发时候建议使用 debug
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
放上如上代码,在启动,ok,我们发现日志如下。
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass1 : ============>JDK Logging<============
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass1 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass1 : This is a warning message
2023-11-29 15:27:02.250 ERROR 26848 --- [ main] com.miaow.demo.MyClass1 : This is a severe messageINFO [main] - ==============>Log4j<==================INFO [main] - This is an info messageWARN [main] - This is a warning message
ERROR [main] - This is an error message
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass3 : ================>Logback<================
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass3 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass3 : This is a warning message
2023-11-29 15:27:02.250 ERROR 26848 --- [ main] com.miaow.demo.MyClass3 : This is an error message
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass4 : ===============>SLF4J<=================
2023-11-29 15:27:02.250 INFO 26848 --- [ main] com.miaow.demo.MyClass4 : This is an info message
2023-11-29 15:27:02.250 WARN 26848 --- [ main] com.miaow.demo.MyClass4 : This is a warning message
2023-11-29 15:27:02.251 ERROR 26848 --- [ main] com.miaow.demo.MyClass4 : This is an error message
在Spring Boot中使用日志有以下几个好处:
-
问题排查和调试:日志是开发和运维过程中非常重要的工具,它可以帮助我们追踪和定位应用程序中的问题。通过记录关键信息和异常堆栈跟踪,我们可以更快地定位和解决问题。
-
运行时监控:日志可以提供应用程序的运行时监控信息,包括请求处理时间、数据库查询时间、方法执行时间等。这些信息可以帮助我们了解应用程序的性能状况,及时发现潜在的性能问题并进行优化。
-
安全审计:日志可以记录应用程序的操作和事件,包括用户登录、权限验证、敏感数据访问等。这些日志可以用于安全审计,帮助我们追踪和分析系统的安全事件,及时发现异常行为和潜在的安全威胁。
-
业务分析和统计:通过日志记录关键业务操作和事件,我们可以进行业务分析和统计。例如,统计用户访问量、分析用户行为、跟踪业务流程等,这些信息可以帮助我们了解用户需求和行为,优化产品和服务。
-
运维管理:日志可以帮助运维人员监控和管理应用程序的运行状态。通过日志,我们可以了解应用程序的运行情况、资源利用情况、错误和异常情况等,及时发现和解决问题,保证应用程序的稳定运行。
总之,使用日志可以提供丰富的运行时信息和统计数据,帮助我们更好地了解和管理应用程序。在开发和运维过程中,合理配置和利用日志可以提高开发效率、问题排查能力和系统稳定性。
相关文章:
在Spring Boot中使用不同的日志
前言,本篇就是介绍在Java中使用相关的日志,适合初学者看,如果对这篇不感兴趣的可以移步了,本篇主要围绕我们Java中的几种日志类型,也说不上有多深入,算的上浅入浅出吧,如果你有一段时间的开发经…...
运维知识点-openResty
openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…...
微服务中配置Nacos热更新
启动Nacos startup.cmd -m standalone 在IDE中启动服务 打开nacos管理后台并选择配置列表 创建配置(这里以日期格式为例) 因为这里配置的是userservice的服务,所以在userservice服务的pom文件中引入依赖 配置一个bootstrap.yml文件 注意这里bootstrap文件中配置过的内容,在app…...
ABAP2XLSX 的安装和demo
ABAP2XLSX 是一个git上面的很好用的工具,它可以帮助abaper们更方便,更简单的生成各种各样复杂的自定义的excel,以满足各企业的信息化建设 在安装这个之前,请先查看之前的博客,去安装abapgit abap2xlsx地址࿱…...
记一篇Centos7安装innodb_ruby
安装innodb_ruby过程非常坎坷,这里记录下安装过程,有些坑当时没有记录下来,主要把完成安装过程就记录下来 yum安装ruby默认的会安装ruby2.0.0版本,但是在安装innodb_ruby时,会报错,提示至少需要2.4版本以上…...
VMware虚拟机安装和使用教程(附最新安装包+以ubuntu为例子讲解)
目录 一、VMware Workstation 17 Pro 简介 二、新功能与改进 三、安装教程 3.1、下载安装包 3.2、运行安装包 四、创建虚拟机 五、启动虚拟机 六、总结与展望 一、VMware Workstation 17 Pro 简介 VMware Workstation 17 Pro是VMware公司为专业用户打造的一款虚拟化软件…...
c语言 / 指针错误的几种情况
1.未初始化的指针,直接释放 int *p; //计算机随机指向一片内存 2.free一个指针,指针没有指向NULL,直接使用 int *p(int *)malloc(sizeof(int)); free(p); //p依旧指向释放前内存的地址, 但是这片内存已经被释放, 被其他变量重新使用, 正…...
Stable-Diffusion——Windows部署教程
Windows 参考文章:从零开始,手把手教你本地部署Stable Diffusion Webui AI绘画(非最新版) 一键脚本安装 默认环境安装在项目路径的venv下 conda create -n df_env python3.10安装pytorch:(正常用国内网就行) python -…...
Day60.算法训练
912. 排序数组 归并排序 class Solution {public int[] sortArray(int[] nums) {int lo 0;int hi nums.length - 1;int[] assist new int[nums.length];sortArray(nums, assist, lo, hi);return nums;}private void sortArray(int[] nums, int[] assist, int lo, int hi) …...
深入了解Java8新特性-日期时间API之TemporalQuery、TemporalQueries
阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…...
记录一次现网问题排查(分享查域名是否封禁小程序)
背景: 收到工单反馈说现网业务一个功能有异常,具体现象是tc.hb.cn域名无法访问,客户地区是河南省,这里记录下排查过程和思路。 首先梳理链路 客户端域名 tc.hb.cn cname—> domainparking-dnspod.cn(新加坡clb)—> snat—&…...
linux下实现Qt程序实现开机自启动
1.原理 要想实现开机自启动,首先,QT是没有这种实现的,最好是靠电脑开机的启动目录启动软件,下面这个目录 /etc/xdg/autostart 这是操作系统中用于配置启动项的目录,该目录下存放着开机自启动的启动器(.desktop)文件…...
TCP 基本认识
1:TCP 头格式有哪些? 序列号:用来解决网络包乱序问题。 确认应答号:用来解决丢包的问题。 2:为什么需要 TCP 协议? TCP 工作在哪一层? IP 层是「不可靠」的,它不保证网络包的交付…...
智慧城市包括哪些内容?有哪些智慧城市物联网方案?
数字城市、智慧城市的发展,离不开对公共基础设施的数字化、智慧化改造升级。通过融合边缘计算、5G、物联网、数字孪生、人工智能等新一代信息技术,助力传统公共基础设施提升增强全流程数据能力、计算能力、服务能力,从而不断丰富公共基础设施…...
Arkts@Watch装饰器与内置组件双向同步深度讲解与实战应用【鸿蒙专栏-14】
文章目录 ArkTS 状态管理深度解析:@Watch 和 $$ 运算符的妙用@Watch 装饰器:状态变量的敏感监听装饰器说明语法说明观察变化和行为表现限制条件使用场景$$ 运算符:内置组件状态的双向同步使用规则使用示例ArkTS 深度探索:@Watch 装饰器与 $$ 运算符的进阶应用进阶应用:@Wa…...
iMazing是什么软件?2024最新版本如何下载
iMazing是一款功能强大的iOS设备管理软件,它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外,它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性,并教…...
LeetCode(40)同构字符串【哈希表】【简单】
目录 1.题目2.答案3.提交结果截图 链接: 同构字符串 1.题目 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符࿰…...
【代码随想录算法训练营-第一天】【数组】704. 二分查找、27. 移除元素
LeetCode-704.二分查找 【错误】第一遍提交的代码 主要错误点: 没弄清楚区间的定义导致:r 在定义处的赋值和 if 判断之后 r 的复制没有想清楚;没有搞清楚判断循环结束的条件;没有搞明白区间的定义,r 和 l 如何赋值&a…...
[教程] 一文进阶Redis
Redis进阶 过期时间(Expire) Redis 的过期时间(Expire)功能是一种数据生命周期管理机制,允许为键设置一个过期时间。一旦达到该时间,键会自动被删除。这对于管理缓存数据特别有用,可以自动清理…...
通用plantuml模板头
通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解
在我的上一篇博客:基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目,该项目展示了一个强大的框架,旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人,更是一个集…...
