日志存档、切分、转档的几种最佳实践

难易 发布于 2012/08/02 10:12
阅读 641
收藏 2

1,按固定时间切分日志。例如,每天生成一个日志

aa.2012-08-02.log
aa.2012-08-03.log
aa.2012-08-04.log

这种日志适合的场景是,管理员大概知道每天生成的日志量,然后希望在n个月之后能精确的找出某天的所有日志。这种日志切分最好由日志库来完成,其次的方法是用cronosplit这种软件来分析日志内容的时间字符串来进行后期的切分,较差的办法是用crontab+logrotate来定期mv(但这并不精确,会造成若干条当天的日志被放到上一天的文件里面去。

2,按照日志大小切分

aa.log
aa.log.1
aa.log.2

多用于开发环境,适合的场景是,程序在短时间内生成大量的日志,而用编辑器vi,ue等能快速打开的日志大小是有限的,或者大的日志打开来极慢。同样的,这种日志的切分可以在事后用split等工具来完成,但对于开发而言会增加步骤,所以最好也是由日志库来完成。值得一提的轮换有两种模式,nlog里面称之为Sequence和Rolling,在Sequence情况下

aa.log   (最新)
aa.log.3 (次新)
aa.log.2
aa.log.1 (旧)

而在Rolling的情况下

 aa.log (最新)

aa.log   (最新)
aa.log.1 (次新)
aa.log.2
aa.log.3 (旧)

很难说哪种更加符合人的直觉。

必须说的是,在这种情况下,只有若干个最新的文件是有意义的,需要日志库来做主动的删除旧的工作。由外部程序是很难判定哪些日志是旧的。

3,按照日志大小切分,但同时加上时间标签

aa.log
aa.log-20070305.gz
aa.log-20070501.gz
aa.log-20071008.gz

这种情况适合于程序本身的日志一般不是很受关注,但是又在某一天想要找出来看的情况。当然,在这种情况下,万一在20070305这一天日志的量超过了指定值,例如10m,就又要退回到第二种状态,在文件名后面加后缀。

 

4,压缩、移动、删除旧的日志

首先,压缩不应该由日志库来完成,因为压缩消耗时间和CPU。日志库的任务是配合压缩。

对于第一种和第三种,管理较为简单,只要符合某些文件名规则或修改日期的,可以用shell轻易的压缩、移动和删除。

对于第二种,其实不是非常需要压缩,只需要删除就可以了,

如果需要支持压缩时候,需要加入动态的判断功能,例如

aa.log
aa.log.1.gz
aa.log.2.gz

(sequence)
mv aa.log  aa.log.3 

(rolling)
mv aa.log.2.gz  aa.log.3.gz
mv aa.log.1.gz  aa.log.2.gz
mv aa.log aa.log.1

不过这么干,又过于蛋疼。据我所知,只有logrotate能干这活儿,毕竟他是独立的程序,能在转档同时搞压缩,不会有混淆的问题。

5,接下来的问题是,上面对日志管理的“范式“是否已经总结了所有的可能性?有没有其他的方式?

@xiaomi_tc  @keron

 

 

加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部