构建你自己的日志系统

引入

在我刚刚入职的时候,接手了一个距我入职有五年的一个系统代码,30w 行的java 再加上15w 行左右的jsp 页面,系统总行数在60w 行左右,而且还没有任何的文档,当初写这个项目的人已经离职了,只有一个还算是熟悉的人,但是出差了,也提供不了多大的帮助,就这样,我在60w 行的代码里开始了为期24天的遨游。

控制台输出的东西多而杂,并且伴随着系统内部的运行输出内容,各种各样的东西,并且由于是分布式的系统,界面上还会输出关于RPC 相关的信息,那个日子真的是不能看。

所以在我完成任务后,我找了这个时间来总结一把我的辛酸泪。

主要的目的:

  • 了解日志的作用
  • 学习在什么时候为什么要打印日志
  • 日志的展示内容
  • 如何定位并说明日志所要表达的意义

日志的基础知识

日志的作用

日志本身是没有价值的,只有对日志进行分析加以利用的时候才会有价值,日志中包含非常多的有用的信息,不光包括运维层面,还包括业务层面、安全层面。
很多时候运维系统最需要的是一个统一告警平台,但是告警的依据绝大多数是对日志等进行自动化分析所得出的结论,所以说日志是非常重要的。

日志级别

日志的级别通常有以下几种:

  • all 最低等级,打开所有的日志输出。
  • debug 指出细粒度信息事件,主要用于开发过程中打印一些运行信息。
  • trace 很少使用。
  • info 在粗粒度上强调应用程序的运行过程,可以用于在生产环境中打印出一些重要信息,但是不要滥用。
  • warn 表明一些潜在的错误内容,有时候不是错误信息,但也是给程序员一些提示。
  • error 指出发生错误事件,但是不影响系统的继续运行。
  • fatal 指出严重的错误事件,可能会导致应用程序的崩溃。
  • off 最高等级,用于关闭所有的日志输出。

日志输出采用的调用链控制的思路,高等级的输出低等级可以控制,但是低等级的输出高等级不能控制。

日志文件命名

通常来说,日志文件的命名必须包含以下信息:

  • 类型标识 用于标明日志的用途或者功能。
  • 日志级别 区分不同级别的运行缺陷。
  • 日志生成时间 方便查询进行排查。
  • 日志备份编号 在进行日志切割时,可以加上编号进行区分。

日志滚动

通常情况下,项目都会在每天打一次日志,并且存库,那么就有了日志滚动,通常情况下有以下模式:

  • 时间滚动 即按照每天或者每12 小时滚动一次。
  • 单个日志文件大小滚动 即当日志文件的大小进行滚动。
  • 同时按照时间和文件大小进行滚动 同时按照时间和文件大小进行滚动日志。

对于日志滚动策略来说,有2个比较关键的参数:最大保留日志数量最大磁盘占用空间。 这2个参数切记一定要设置,如果没有设置,则很有可能会出现把线上机器磁盘打满的情况。

日志的打印时机

日志是为了开发人员在遇到开发问题可以快速地定位问题,并且根据输出的信息,判断如何快速修复的主要内容。所以日志的输出时机就很重要了,日志输出的少了,开发人员很难找到关键的问题,输出日志太多,就容易需要花费大量的时间筛选需要的日志信息。

下面就是常见日志的打印时机:

  • http、rpc 调用 在程序调用其他服务或者系统的时候,需要打印接口调用参数和调用结果(成功/失败)。
  • 程序异常 在程序出现exception的时候,要么选择向上抛出异常,要么必须在catch块中打印异常堆栈信息。
  • 特殊的条件分支 程序进入到一些特殊的条件分支时,观察输出内容。
  • 关键执行路径及中间状态 在一些关键的执行路径以及中间状态也需要记录下关键日志信息,方便后续定位跟踪执行状态。
  • 请求入口和出口 方便后续进行日志统计,同时也更加方便进行系统运行状态的监控。

日志的内容与格式

日志打印时机决定了能够根据日志去进行问题定位,而日志的内容决定了是否能够根据日志快速找出问题原因,因此日志内容也是至关重要的。

通常来说,一行日志应该至少包括以下几个组成部分:

  • RequestId
  • date
  • thread
  • level
  • logTag
  • param
  • exceptionStacktrace

日志分析

在应用程序运行过程中,就会产生日志,那么开发人员通过这些日志就可以判断出对应的问题点了,然后就可以解决。
在日志回滚之后,就会得到许多的日志文件了,那么对于运维人员来说,如何解析这些日志文件就是比较头疼的问题了,现在的做法都是通过自动化的解析来显示应用程序运行期间的日志输出信息。

良好的日志书写使用将为开发和运维提供便利;良好的日志级别定义和配置,在为快速定位问题的前提上,将可以有效地提升性能。

Web 日志挖掘分析

这是一个比较深的东西,我需要研究一下再写。

可以看看这些,我觉得比较好:
https://www.kancloud.cn/alicloud/log_management/574513
https://cloud.tencent.com/developer/article/1066751


使用案例

我会自己搭建一个项目,跑出来真正的线上运行日志文件,然后进行日志分析,结果会在后期展示出来。


个人备注

此博客内容均为作者学习与官方文档所做笔记,侵删!
若转作其他用途,请注明来源!