小序
- 充满对运维的好奇,懵懂地步入运维的大坑。突然,天际划过一道云光,空中布满的巨云渐渐散去,化为一朵朵pretty彩云。猛地低头,发现一个小坑,似乎篆刻LOG分片的九阴真经~~~
- 本文介绍log分片的两种方法,以及自己遇到的pit和解决方案~~
什么是Log分片
i.e.把系统的LOG日志按照时间等顺序进行分割,生成多个独立LOG文件的过程 (自己理解的~可能不太准)
- 有些也称为
LOG分割
环境
- ubuntu 16.04
如何实现LOG分片
想法一:Contrab+SHELL
首先我们要写个SHELL脚本分割日志
此处以nginx的error.log和access.log的分片为例
shell脚本如下
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
logs_backup_path="/var/log/nginx/logs_backup/$year-$month-$day"
logs_path="/var/log/nginx/"
logs_access="access"
logs_error="error"
date_format=`date '+%Y-%m-%d_%H:%M'`
access_path=${logs_backup_path}/access
error_path=${logs_backup_path}/error
[ -d $access_path ]||mkdir -p $access_path
[ -d $error_path ]||mkdir -p $error_path
cp ${logs_path}${logs_access}.log ${access_path}/${logs_access}_${date_format}.log
cp ${logs_path}${logs_error}.log ${error_path}/${logs_error}_${date_format}.log
- 原本是直接使用mv命令来移动日志的,但是发现移动一次以后,在
/var/log/nginx
目录下就不再生成新的access.log日志了,即在不重启nginx的情况下,nginx原来的文件句柄无法访问,不会自动创建新的log文件了。因为nginx只在启动的时候获取一次log文件的句柄,之后一直使用这个句柄。(来自张老板的教诲) - 所以改用了cp命令,然后再清空原来的文件内容,并不删除文件。这样就解决了之前的问题。
创建计划任务
crontab -e
59 23 * * * /bin/bash YOUR_BASH_PATH
这里创建了一个每天23点59分执行的计划任务。
- 注:如果想把crontab默认编辑器改成vim可以使用如下命令(个人感觉比nano好用些)
export VISUAL=vi
- 效果(这里把分片时间间隔调为1min了,有所裁剪)
.
├── access.log
├── error.log
└── logs_backup
└── 2018-11-30
├── access
│ ├── access_2018-11-30_15:48.log
│ ├── access_2018-11-30_15:49.log
│ ├── access_2018-11-30_15:50.log
│ ├── access_2018-11-30_15:51.log
│ ├── access_2018-11-30_15:52.log
│ ├── ...
│ └── access_2018-11-30_16:20.log
└── error
├── error_2018-11-30_15:48.log
├── error_2018-11-30_15:49.log
├── error_2018-11-30_15:50.log
├── error_2018-11-30_15:51.log
├── error_2018-11-30_15:52.log
├── ...
└── error_2018-11-30_16:20.log
想法二:Crontab+logrotate
logrotate是linux自带的,可以进行日志轮转操作的工具。
它的配置文件在
/etc/logrotate.conf //主配置文件
/etc/logrotate.d/ //单独配置文件目录
编辑
vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily //每天切割.可以设置:月monthly 周weekly 年yearly
dateext //%Y%m%d作为后缀
missingok //如果日志不存在忽略错误
rotate 14 //保留最近14天的日志记录
compress //转储之后使用gzip压缩
notifempty //空文件不转储
create 640 nginx adm //新日志文件模式
sharedscripts //整个日志组运行一次的脚本
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
//重启nginx,重新加载日志文件,防止不写
`cp -f /var/log/nginx/*.* /var/log/nginx/backup`
//自定义脚本,将旧日志copy到backup文件夹(确保backup目录存在)
endscript
}
添加定时任务
crontab -e
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
重启cron服务
/etc/init.d/crond restart