Java:使用Spring and Logback或Log4j2将多行日志折叠成单行日志

Logback和Log4j2是一些最著名的JAVA日志记录框架。 Logback框架仅与SLF4J库结合使用,该库是事件日志记录系统的接口。 Log4j2是Log4记录器的第二个改进版本,Log4记录器是一个日志库,其中的API和实现是分开的,它使您可以将Log4j 2 API与另一个记录器的实现结合使用。

Spring Music是一个将Cloud Foundry环境数据库服务与Spring Framework和Spring Boot结合使用的应用程序。 它被创建为将相同的域对象存储在许多不同的存储库之一中-对象关系,面向文档或分布式(键值存储)。



与Spring / Spring Boot一起使用的两个最常见的记录器是Logback和Log4j2。 直到最近,开发人员在日志格式和用于日志记录的文件本身方面有了更大的行动自由。 但是,在现代的容器实现和扩展世界中,日志记录通常提供需要一定程度的标准化的企业解决方案。

最大的问题之一是Java异常通常会在日志中导致大型的多行堆栈跟踪。 因此,您得到的是100多种不同的日志,而不是单个日志事件指示异常或错误消息,每个日志用于堆栈跟踪的每一行,并散布着来自其他服务或服务实例的其他日志事件。

本文介绍了如何配置Spring Boot应用程序以在一行中折叠Logback记录器和Log4j2的异常。 这使我们可以将异常日志记录和堆栈跟踪视为一个事件日志。


JAVA中的错误和异常类


JAVA已检查和未检查的未检查异常

春季音乐应用


在本文中,对于自定义日志记录,将使用spring-music应用程序的自定义版本,这对于Logback和Log4j2记录器的操作是必需的。 首先,您需要确保我们可以从源代码中重新创建它。 该项目需要Java8,因此第一步是在Ubuntu主机上安装Java8。



然后,我们使用github获取项目的源代码,并使用Gradle构建系统的内置脚本创建程序集:



使用Logback折叠多行异常


让我们继续使用标准Gradle命令通过Logback记录器的实现创建jar项目的jar归档文件:



文件“ build / libs / spring-music.jar”是自动执行的,并且包含绑定到本地主机的内置Tomcat:8080。 使用以下命令调用jar文件:



在浏览器中调用http://本地主机:8080将显示一个带有相册列表的页面,并且将在控制台中显示如下所示的日志行:



使用自定义模板在“ src / main / resources / logback-spring.xml ”中定义了此日志行语法:



变量$ {...}是从application.properties和系统属性中提取的,可以在页面http:// localhost:8080 / env上查看。 但是,我们需要的部分代码位于消息(%m)之后。



“ MULTIEXCEPTION”一词没有特殊含义,它只是一个独特的字符串标记,使我们能够找出消息的结尾(%m)和异常开始的地方。 如果需要,可以保留此标记。

此外,我们不只是插入会用换行符引发大堆栈跟踪的%xException占位符,而是使用%replace函数转换值并将所有换行符替换为表达式“ \ u2028”,这是Unicode字符串定界符视图

从堆栈跟踪中删除字符“ \ n”意味着现在将以单行形式发送堆栈跟踪。 为了证明这一点,请转到http:// localhost:8080 / errors / throw ,其中有一个错误控制器故意使用以下代码抛出NullPointerException:



这将在控制台中创建一条日志行,如下所示:



在这里可以看出,表达式“ u2028”将堆栈跟踪中的换行符分隔开。 现在,异常消息和堆栈跟踪将作为一个单元发送。



使用Log4j2折叠多行异常


要覆盖默认的构建脚本并将Log4j2用作该项目的备份实现,您需要使用“ build-log4j2.gradle”文件。



文件“ build / libs / spring-music.jar”是自动执行的,并使用内置于本地主机的Tomcat:8080。 与前面的示例一样,使用以下命令调用jar文件:



使用浏览器调用http://本地主机:8080将显示一个包含相册列表的页面,并向控制台输出如下日志行:



使用自定义模板在“ src / main / resources / log4j2.xml ”中定义了此日志行语法:



变量$ {...}是从application.properties和系统属性中提取的,可以在页面http:// localhost:8080 / env上查看。 但是,我们需要的部分代码位于消息(%m)之后。



“ MULTIEXCEPTION”一词没有特殊含义,它只是我们选择的唯一行标记,它使您可以找出消息的结尾(%m)和异常开始的地方。 如果需要,可以将其保留。

但是之后,我们不只是插入会使用换行符引发大堆栈跟踪的%xException占位符,而是使用%replace函数转换该值,该函数将所有换行符替换为表达式“ \ u2028”,这是一个分隔符Unicode字符串

从堆栈跟踪中删除字符“ \ n”意味着现在堆栈跟踪将作为一行发送。 为了证明这一点,请转到http:// localhost:8080 / errors / throw ,其中有一个错误控制器故意使用以下代码抛出NullPointerException:



这将在控制台中创建一条日志行,如下所示:



如您所见,此处的表达式“ u2028”将堆栈跟踪中的换行符分隔开。 现在,异常消息和堆栈跟踪将作为一个单元发送。

结论


将Java堆栈的多行跟踪折叠为一行的能力意味着该技术可以视为一种集中式日志记录解决方案。
如果在源端执行此折叠更为有效,则没有理由浪费计算和人力来使用相关标识符,较大的堆栈大小,较高的处理器利用率和智能分析来在目标端还原堆栈跟踪。

在这种情况下,始终可以在收集日志的一侧(例如,在用于收集,过滤和规范化Logstash日志的管道的一侧)替换Unicode字符,以将消息还原为原始格式。

参考资料



一点广告:)


感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或向您的朋友推荐给开发人员的基于云的VPS, 最低 价格为4.99美元这是我们为您发明的入门级服务器独特类似物: 关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗? 只有我们有2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视在荷兰起价199美元 戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起! 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN482804/


All Articles