日志管理 - 我的实践经验笔记

所有的真相都在你的日志中

因为工作涉及管理两个企业内部的财务系统的运维工作，两个业务系统都是面对企业内部员工的，企业有 1 万多员工，所以日志的数量虽然比不上互联网应用的数量，但多台服务器多个实例，要找日志分析问题时，会有一些头疼，总结了几点经验，用于以后的日志管理工作。

TL;DR

使用日志聚合工具，将多个节点日志聚合

使用 Logrotate

明确日志的等级，warn，info，debug*

与外部系统的交互都需要明确记录 *

使用 TraceID 跟踪事件

使用日志聚合工具

黑匣子（black box），是飞机专用的电子记录设备之一，又称为航空飞行记录器。里面装有飞行数据记录器和舱声录音器，飞机各机械部位和电子仪器仪表都装有传感器与之相连。它能把飞机停止工作或失事坠毁前半小时的有关技术参数和驾驶舱内的声音记录下来，需要时把所记录的参数重新放出来，供飞行实验、事故分析之用。

当用户量到达成一定量，业务系统非常关键时，一般会将应用运行多个节点，运行在不同服务器中，做高可用，这样日志会分散在不同的服务器上，如果要查找某条日志，需要在多台服务器中进行查找，非常麻烦，使用日志聚合工具则可以解决这个问题。
目前使用Graylog来做多个日志的聚合。Graylog 有个服务端，其他应用通过 API 将日志发送过来，接口可以是 syslog 或者 graylog 提供的读取文件日志的程序，graylog-collector-sidecar, 这样现有的业务应用无需做任何变更。

使用 ElasticSearch 作为文件存储和搜索工具，使得日志的检索变得非常方便快捷，让查找日志变成一个非常轻松的活。
除了使用 Graylog，还有ELKstack

使用 Logrotate

这里的 Logroate 既指 Linux 下的 logrotate 工具，也指日志轮询的方式，你可以在应用程序中轻松实现日志的滚动，每当日志文件到达指定大小则将该日志改名，创建新日志文件；只保留一定数量的日志文件在应用服务器中，将历史日志文件自动删除。另外如果在 linux 服务器中，也可以使用 Logrotate 命令来自动压缩日志文件。

使用日志等级

打印日志的时候，针对不同的事件重要性，区分打印不同的事物等级，在收集到 Graylog 中后，可以区分不同的事件等级后，可以发送邮件提醒相关操作，在检索时也能快速定位。

记录与外部系统的交互

如果系统涉及与外部其他系统进行交互，做的接口需要记录与其他系统交互的信息，收到请求为什么内容，响应是返回什么内容，在后续跟踪排查问题时，才有迹可查。

创建一个维护的 TraceID

随着微服务架构流行，一个事件需要涉及在系统多个组件中进行处理，那么在事件发生时，创建一个唯一的 TraceID，在日志收集完成后，根据这个 TraceID 可以在不同的组件中找到该时间的处理过程。

扩展阅读

12 要素 App - by Heroku