[聚合文章] 根据条件过滤日志输出

JavaScript 2018-01-14 20 阅读

一个在很多项目里可能存在的场景:各种原因导致了很多人在共用一套环境,然后要在这一套环境上进行各种开发、调测、定位活动,由于用的人多,查看日志就变得很麻烦,首先要从极速刷新的日志里先找到关注的关键字,然后从关键字的位置再找出处理这一请求的上下文日志来,经常重复这样的操作,严重地影响了工作效率。

所以最近想花时间来解决这个问题,思路是用户在浏览器或者命令行上发起查看日志的请求,同时指定自己查看日志的过滤条件,这个过滤条件针对的是日志框架的 MDC(Mapped Diagnostic Context)信息,这些MDC信息来自于请求参数,客户端特征信息,也可以是业务逻辑自行指定,然后再拦截日志框架的日志输出,所有的日志输出都和用户的过滤条件进行匹配,匹配上了就流式地返回给用户。这样用户就可以单独地收到一份只包含符合特定过滤条件的日志了。比如,用户可以指定只查看某个客户端IP请求的日志内容,大大提升日志查看的效率。

当前的实现方案,选择了基于 tomcat 对外暴露一个 websocket 的接口(为了便于扩展,以及满足简单、优雅地返回流式数据的要求)用来接受用户的请求,然后在 logback 的所有 Logger 上额外注册一个 Appener,拦截到所有日志后,根据用户请求的过滤条件过滤日志信息,并不断返回响应。同时,也自动注册了一个 Web Filter,这个 Filter 会将 http 请求的很多信息注册到 MDC里并在请求结束时自动清理,也试验性地增加了一个非常简单的 web 页面,可以访问这个http页面,带上过滤参数,然后过滤后的日志就不断地刷新出来了。项目的使用非常简单,一个 jar 包扔到 web 应用里,不用做其他任何事情了。

由于是 websocket 的接口,所以应该可以非常方便地做出一个方便好用的web页面来,而对于开发人员来说,可能有大部分在后台查看日志的场景,后续会补上一个用go语言封装的简单命令,支持在后台直接查看日志,类似这样: catlog -s "ws://127.0.0.1/context/logcat" -c a=1

项目地址在: https://github.com/qiyi/cat

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。