
日常开发部署时要避免的两个打爆磁盘的问题
日常开发部署时要避免的两个问题,处理不当,打爆磁盘,写COE,写 casestudy,怀疑职业选择。
生产日志输出到控制台上
有的同学在开发的时候,自己本机调试,喜欢把日志打到控制台上。方式是在logback.xml或者是log4j2.xml文件中进行了以下的配置(其他语言类似):
上面代码中ConsoleAppender会处理将日志打印到控制台上。
在本机这样调试没有问题,但是到了生产环境,一般需要应用日志与启动日志分离。像上面的配置,root下配置了所有日志都会打印到控制台,而启动日志没有做好日志压缩和滚动清理,就会打满磁盘。
历史日志未清理
机器故障是日常运维中经常出现的问题。一般情况下,机器是可以被修复的,修复时间一般要几天到几个月不等。修复好了,手工一点的公司,会通知开发人员机器已恢复,可以将应用启用了。
然而,应用启动后一段时间磁盘,竟然收到告警说磁盘马上要被打满了。这是怎么回事咧。以logback为例说说日志清理的原理。
其中如下定义了压缩和历史日志的保存策略,有两个比较重要的参数:maxFileSize,maxHistory
先看一下继承关系图
继承关系
maxHistory默认为0,由源码可以看出(TimeBasedRollingPolicy-start()),只有不为0并且清理任务开启标志位true时会触发清理操作
清理过程会先计算需要清理的时间范围
删除时会根据当天时间,生成一个正则表达式:/*****/rsms_all_2018-04-09.(\d{1,3}).log.zip,满足条件的文件就会被清理掉。
由以上可以得出两个结论
- 如果首次项目启动时,超出maxHistory定义的时间的64天之前的日志是不会被清理的
- 如果当天日志的编号超出3位数后缀,也将不会被清理
总结
上面两个问题其实可能对于很多人来说,理解是很简单的事情。但是有两点需要提醒:
1、要从原理上彻底理解清楚
2、要有良好的规范和方法来避免这样的问题。这一点,目前大多数公司都做不到
参考文章
https://www.jianshu.com/p/d9c08785430a
文章转载自公众号:编程一生
