阅读量:1
一 服务器日志日益激增带来的问题
随着系统服务用户的数量增加,系统的功能增加,服务器里积累的日志会越来越多。这会导致服务器硬盘被写满,导致系统出问题。通常情况下,只要删除日志即可。但如果积累日志的速度很快,并且面对复杂的线上环境,日志的维护会变得很繁琐。甚至由于维护过程中的疏忽造成影像系统运行的风险。
二 简单高效的解决方案
解决这个问题的思路也很清晰,按照下面的步骤处理日志,并让系统定时执行。
定时把日志拆分出来,做备份。
拆分出来的日志按照时间命名。
服务器里仅保留特定数量的日志备份,超过备份数量的日志将被删除。
三 实际案例和步骤
经过在网络上的资料查询,发现 logrotate 是一个好工具。它结合了 linux 的自动任务加上日志的各种处理动作,给系统运维提供了便捷的日志维护自动化能力。具体步骤如下:
step1:安装 logrotate
yum install -y logrotate
默认 logrotate 安装在 etc 目录下,其中:
/etc/logrotate.conf 主配置文件。
/etc/logrotate.d 目录下可以存放很多具体的日志滚动切割规则配置文件,我们想要自动拆分日志的配置都可以单独的放在这里,方便后续的维护和修改。
step2:配置日志分割文件
在这个例子中,我们要分割 nginx 的 access.log 文件,具体操作如下:
#在 /etc/logrotate.d/ 目录下新建一个叫做 access 的配置文件 cd /etc/logrotate.d vim access # 然后编辑 access 文件: /usr/local/nginx/logs/access.log{ weekly missingok rotate 8 create copytruncate noolddir dateext compress delaycompress notifempty sharedscripts } 编写完配置文件,保存即可。
具体的配置说明如下:
配置项 | 说明 |
---|---|
daily | 每天滚动一次 |
weekly | 指定滚动周期为每周 |
monthly | 指定滚动周期为每月 |
notifempty | 如果文件为空,则不滚动 |
missingok | 如果文件不存在,则不滚动 |
rotate 7 | 保留最近7个日志文件 |
compress | 压缩日志文件 |
delaycompress | 延迟压缩,延迟到下一次日志分割的时候。注意这个要结合 compress 一起使用 |
create 640 root root | 新建日志文件的属主及权限,如果 nginx 不是root 用户运行的要特别注意 |
sharedscripts | 共享脚本,即日志滚动完成后再运行脚本,否则每滚动一个日志文件都要运行一次脚本 |
postrotate | 日志滚动完成后运行的脚本,有些业务日志可以不需要这个脚本 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 |
nocopytruncate | 备份日志文件不过不截断 |
nocreate | 不建立新的日志文件 |
errors address | 滚动时的错误信息发送到指定的 Email 地址 |
ifempty | 即使日志文件为空文件也做滚动 |
mail address | 把滚动的日志文件发送到指定的 Email 地址 |
nomail | 滚动时不发送日志文件 |
olddir /log | 滚动后的日志文件放入指定的目录,这里是/log,必须和当前日志文件在同一个文件系统。 |
noolddir | 滚动后的日志文件和当前日志文件放在同一个目录下 |
sharedscripts | 共享脚本,即日志滚动完成后再运行脚本,否则每滚动一个日志文件都要运行一次脚本 |
prerotate | 在滚动之前需要执行的指令,例如修改文件的属性等动作,必须独立成行 |
postrotate | 在滚动之后需要执行的指令,例如重新启动 (kill -HUP ) 某个服务;必须独立成行 |
dateext | 使用当期日期作为命名格式 |
dateformat .%s | 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合 |
dateext | 使用,只支持%Y /%m /%d /%s 四个参数 |
size log-size | 当日志文件到达指定的大小时才滚动,以下为合法格式: size = 5 或size 5 (>= 5 个字节就滚动) size = 100k 或size 100k size = 100M 或size 100M |
step3: 验证配置结果
为了验证配置文件是否能正常工作,我们可以使用下面的命令:
logrotate -d /etc/logrotate.d/nginx # 如果输入下面内容,并没有报错信息,说明配置文件有效。 reading config file /etc/logrotate.d/nginx Allocating hash table for state file, size: 15360 B Handling 1 logs rotating pattern: /var/log/nginx/*.log after 1 days (7 rotations) empty log files are not rotated, old logs are removed considering log /var/log/nginx/*.log /access.log log does not need rotating (log has been already rotated) considering log /var/log/nginx/*.log /error.log
我们也可以手动激活分割,看看效果:
logrotate -f /etc/logrotate.d/nginx # 执行完该命令,系统会手动触发一次日志分割,分割的文件和分割细节和我们的 nginx 文件配置有关。 # 过一段时间再来看日志,就可以看到分割效果。 access.log access.log-2024-01-01 access.log-2024-01-08
总结
按照上面的步骤执行完后,日志分割维护任务就交给我们服务器自己吧。