业务场景:
日志系统整体迁入ELK,大体需要两种日志:
- 纯业务日志,记录业务代码中的信息;
- 访问日志,包括请求参数和返回结果。
关于ELK这里不做过多讲解,一般也是公司运维同事维护,这里只介绍如何将日志打印成可被收集输送到es的json格式。
选用的工具是目前应用广泛的Logback JSON encoder
业务日志
首先是logback.xml配置:
其中用到了一个NoEscapingJsonFactoryDecorator
,用来取消对非ASCII字符的转码,防止换行符导致输出混乱。
这里还用到了异步打印的配置,比较常见。
业务代码中打印日志时就正常打印即可,没有什么特别。
这样打印出来的日志就是json格式,默认包含如下字段(手动格式化了):
访问日志
其实Logback JSON encoder自身是支持访问信息打印的:AccessEvent Fields
但是我这里还想打印返回信息,所以没有用这个,还是用LoggingEvent Fields,增加自定义字段。
logback.xml配置基本一样:
重点是在打印日志时,需要设置自定义属性,使用的是Markers来实现。
文章中介绍了两种技术:
- Markers:只在外层json输出打印,不在message字段中追加;
- StructuredArguments:在外层json输出中打印,同时在message字段中追加。
对于访问日志,只需要在外层json输出打印即可。
文档中提供的例子:
我们在实际应用中的方式:
这样打印的结果(手动格式化了)如下:
完整的打印日志Filter如下: