问题背景: 一个线上系统,需要将系统运行的日志打印到本地磁盘中(没有将日志上传到某个日志系统的技术),日志包括诊断日志( INFO,WARN,ERROR )和访问日志( accesslog )。我们希望日志的输出既能方便问题的分析,也不能影响系统的长期稳定运行,系统在正常运作的过程中,尽可能“免维护”。
我们假定日志输出的内容是规范的,我们已经实现输出“不多不少”的日志(即不会输出没用的日志,我们这里不讨论应该输出怎样的日志内容)。
由于日志只能打印到本地磁盘,本地磁盘空间是有限的,因此我们需要用日志轮替的方式来控制历史日志的数量。
按日期轮替: 按日期轮替即把日志按天分割,保留一周或两周的日志。 优点:采用该轮替方案,可以很方便问题的分析和查找(例如客户说某天系统出问题了,可以根据日期查找),而且对于日志的保留可以更符合业务要求(如业务要求保留过去两周的操作记录)。 缺点:采用该轮替方案,万一日志量过大,或者磁盘过小,或者由于某种程序错误导致大量的 ERROR 日志产生,容易造成日志文件过大,消耗完了磁盘空间,最终导致系统不可用。
按大小轮替: 按大小轮替即把日志按照固定大小分割,例如限定一个日志文件最大为 100M,当日志写满 100M 时,会分割出一个文件。可以控制保留日志文件的数量来控制日志量。 优点:采用该轮替方案,控制很好控制系统消耗的磁盘大小,例如我们设定日志文件最大 100M,保留 10 个文件时,我们可以预知系统最多占用 1G 的磁盘空间。 缺点:采用该轮替方案,对问题分析不友好,需要逐个文件打开分析。对业务不友好,日志量多时,可能几天前的日志就被冲掉了。
这里希望跟大家讨论一下,如何采取正确的策略,考虑哪些因素,可以分类讨论。 第一次发表,请多多包涵,多谢!
1
shoaly 2019-01-25 21:35:11 +08:00 1
我是按大小 去切割的.
文中说的定位日期 其实很简单的, 每次切割出来归档的那个日志 是有创建时间的... 所以要定位看某一天的日志是完全没问题的 |
2
julyclyde 2019-01-25 21:46:58 +08:00
日志的行应该包含足够的信息,尤其是该行的时间戳
依赖文件名、文件修改时间等都是不靠谱的做法,因为把本质的内容放在外边这个不可靠的机制里了 |