浅谈Java日志格式化
在软件开发中,日志是一个非常重要的数据,特别是在程序发生异常时,日志可以提供非常有价值的信息。但是,并不是打印的日志越多越好,我们需要的是有用的日志。下面我们来讨论一下Java日志格式化的重要性、日志采集分析、为什么使用Logstash处理Java的异常信息不好做、日志JSON化等知识点。
一、日志的重要性
日志是一个非常重要的数据,特别是在程序发生异常时,日志可以提供非常有价值的信息。当程序发生异常时,日志可以帮助我们快速定位问题,减少问题的解决时间。但是,并不是打印的日志越多越好,我们需要的是有用的日志。如果日志没有进行规范,开发、运维也没有把这个事情放在心上,那么在压测的时候TPS和响应时间一直上不去。通过jstack分析发现,大部分的log数据在阻塞。
二、日志采集分析
目前主流的ELK系统应该都是通过agent端(filebeat/flume)采集具体.log文件,对于日志没有多大处理的话,我们可能把整条日志采集过来后,通过logstash后把message存储到elasticsearch中。当我们需要从每条日志中提取日志时间、日志级别等等信息的时候,我们需要在logstash配置相应的grok语法解析其中的message信息。但是,当我们的日志中有异常信息,我们需要提取异常信息的时候,你会发现用grok来清洗message很困难!其实也有解决的方法,需要你去慢慢写正则匹配不错,logstash强大的grok及mutate可以满足需求,但是当日志量很大的时候,logstash的grok和mutate会消耗大量的资源。
三、为什么使用Logstash处理Java的异常信息不好做
这就涉及到日志框架输出的异常信息通常是多行的,这就意味着我们需要在filebeat(flume)或者logstash来处理多行的问题。当我们在日志的配置文件没有很好的区分日志的message和stack时,日志是糅杂一块的。提前其中的信息很难很难。
四、日志JSON化
既然原生的日志数据不好处理,那么我们需要对日志框架做些美容手术。在日志中,我们一般都会打印,时间/日志级别/线程/日志内容/当前文件名/loggerName/异常信息等等。其中日志内容和异常信息可能会出现多行。这个需要处理下,下面我们使用fastjson来处理这两个字段。
通过fastjson,我们可以将日志内容和异常信息处理成JSON格式,然后在logback.xml中配置conversionRule,即可实现日志的JSON化。这样我们就可以方便地在ELK系统中进行日志分析和处理。