聊一聊项目中的日志配置(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 今天我们还是来讲讲日志,不过,不是关于日志的保存,而是关于在项目中遇到需要在程序中多处输出日志且每次的日志量都很大时,我们可以如何处理来提高程序的性能。

强哥之前有发过一篇文章:聊一聊项目中的日志配置,其中讲述了项目log4j日志配置文件中,通过修改一些参数实现日志分期保存以及保存文件个数限制相关问题以及相应的处理方式。当然如果日志量过大还是推荐项目中接入ELK将日志放入搜索引擎中进行后期的查询处理。


今天我们还是来讲讲日志,不过,不是关于日志的保存,而是关于在项目中遇到需要在程序中多处输出日志且每次的日志量都很大时,我们可以如何处理来提高程序的性能。


当程序逻辑复杂需要输出日志的点很多时(用于排查问题);当程序多个点需要输出日志,且每个点输出的日志内容较大时;当应用用户访问量大、并发高导致日志输出非常快时;当QA压测觉得你的程序性能较差时……


为了提升我们程序的性能,同时兼顾日志的输出而不至于对业务逻辑有较大的影响,无疑,我们要做的就是将日志的输出从业务逻辑的中剥离出来,更准确的将应该是通过异步的方式,使得日志输出对业务影响降到最小,同时不影响我们必要的日志的输出和保存。


异步日志输出:


接下来我们也就简单的讲解一下,在Springboot项目中(使用log4j2),如何配置上全局的异步日志以及如何验证程序确实开启了异步日志输出。


首先提一下为什么要使用log4j2吧,因为在log4j版本中,异步输出日志的功能问题还比较多,性能上也差了许多,今天发的另一篇会展示两者的差异。所以,在0202年当下,还是建议大家能够将log4j升级到log4j2。当然,如果你使用的是logback日志工具,它同样也带有开启异步日志输出的方式,大家感兴趣的可以自行百度。


其实Springboot配置log4j2异步输出日志方式比较简单,有混合模式和全模式,官方也比较推荐使用全异步模式,最大提升性能。所以强哥这里也就只提一下全异步模式的配置方式:


步骤一、添加依赖:


<dependency>  <groupId>com.lmax</groupId>  <artifactId>disruptor</artifactId>  <version>3.4.2</version></dependency>

步骤二、修改启动类或在项目启动时语句中加入属性参数:


修改启动类:


@SpringBootApplicationpublic class TestApplication {public static void main(String[] args) {//下面语句使得日志输出使用异步处理,减小输出日志对性能的影响        System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");        SpringApplication.run(TestApplication.class, args);    }}

修改项目启动语句:


java -jar -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector xxx.jar


两种方式选择一种就行。按个人喜好处理。


没错,就上面简单的两步就能实现在项目启动后,异步日志的功能。当然,有的人可能还会问:配置是配置上了,可是到底是不是真的实现异步日志输出了呢?要怎么验证呢?


这里,我们可以通过查看项目启动后的线程名来检查是否真的配置成功了。下面是强哥在启动项目后,项目中的线程情况截图:


7.png


可以看到,有两个线程是关于Log4j2的,其中上面红框中的Log4j2-TF-AsyncLogger就是异步日志输出线程。看到它说明我们的配置是成功的。如果还是不确定,可以Debug模式运行项目,选择该线程,ide会进入到该线程查看程序到达该线程的一系列的操作,由此便可以知道成功配置了异步日志输出功能。


好了,上面便是Springboot实现log4j2异步输出日志的相关实现。其实内容相对简单,但是强哥更希望传递的是当大家遇到问题的时候,能够想到相应的解决方式,对于项目中与业务逻辑并非必要但是却影响性能的地方,完全可以通过异步或拆分的方式来保证性能。


这里没有讲解过多的原理,只是因为网上相应的原理说明确实太多,但是如何配置实现却都含糊不清,大家对原理等有兴趣也可以自己多去了解,这里只做抛砖引玉的作用啦,只希望大家遇到日志相关的瓶颈时,可以想到此解决方式。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
12天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
121 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
17天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
1月前
|
网络协议 Linux Windows
Rsyslog配置不同端口收集不同设备日志
Rsyslog配置不同端口收集不同设备日志
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
38 1
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
132 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
3月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
3月前
|
存储 容器
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
|
3月前
|
人工智能
【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中
【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中