日志概述
简介
当网站访问量大后,日志数据就会很多。
如果全部写到一个日志文件中去,文件会变得越来越大。
文件大速度就会慢下来,比如一个文件几百兆,写入日志的时候,就会影响操作速度。
工具
常见的日志切割工具:
- 工具切割:logrotate
- 脚本切割:Shell脚本、Python脚本
日志切割- logrotate
安装Logrotate
CentOS、Redhat系统默认安装了Logrotate,如需安装如下:
查看logrotate是否安装
rpm -ql logrotate
查看logrotate命令所属安装包
yum search logrotate
安装logrotate命令
yum -y install logrotate
配置Logrotate
查看logrotate安装文件
rpm -ql logrotate
/etc/cron.daily/logrotate #
/etc/logrotate.conf #logrotate的配置文件,用于配置主切割规则
/etc/logrotate.d #logrotate的子配置文件,用于配置子切割规则
/etc/rwtab.d/logrotate
/usr/sbin/logrotate #logrotate的程序
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
配置文件详解
cat /etc/logrotate.conf | grep -v "^#" | grep -v "^$"
weekly #定义日志每周一轮轮转
rotate 4 #定义日志保留4个备份
create #定义日志创建新的空白日志文件替代旧文件
dateext #定义日志使用日期为文件名后缀,禁用此项默认数字为后缀
include /etc/logrotate.d #加载指定目录下配置文件,此目录下保存的是日志切割策略规则
/var/log/wtmp { #定义那个目录下日志的轮转
monthly #此目录下的个性化设置,定义每月轮转一次
create 0664 root utmp #此目录下的个性化设置,定义创建的新日志文件权限、属主、数组
minsize 1M #此目录下的个性化设置,定义日志文件超过1M后才会切割
rotate 1 #此目录下的个性化设置,定义日志保留1个备份
compress #此目录下的个性化设置,定义日志文件压缩启动,后缀为.gz
}
/var/log/btmp {
missingok #此目录下的个性化设置,设置在日志轮转期间任何错误都会被忽略
monthly
create 0600 root utmp
rotate 1
}
Nginx应用logrotate切割日志
- 编辑配置文件
cat > /etc/logrotate.d/nginx << EOF
/usr/local/nginx/logs/access.log {
hourly
rotate 7
missingok
dateext
compress
delaycompress
notifempty
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then #判断nginx是否启动
/usr/local/nginx/sbin/nginx -s reload #重启Nginx
fi
/bin/kill -HUP `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true #防止切割的新日志文件出现旧日志
endscript
}
/usr/local/nginx/logs/error.log {
hourly
rotate 7
missingok
dateext
compress
delaycompress
notifempty
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then #判断nginx是否启动
/usr/local/nginx/sbin/nginx -s reload #重启Nginx
fi
/bin/kill -HUP `cat /usr/local/nginx/logs/nginx.pid 2> /dev/null` 2> /dev/null || true #防止切割的新日志文件出现旧日志
endscript
}
EOF
- 参数解释
--配置参数解释
/usr/local/nginx/logs/access.log 指定需要轮转处理的日志文件
hourly 日志文件轮转周期,可用值为'hourly/daily/weekly/yearly'
rotate 7 轮转次数,即最多存储7个归档日志,会删除最久的归档日志
missingok 忽略错误信息
dateext 以当前日期作为命名格式
compress 轮循结束后,已归档日志使用gzip进行压缩
delaycompress 与compress共用,最近的一次归档不要压缩
notifempty 日志文件为空,轮循不会继续执行
sharedscripts 表示postrotate脚本在压缩了日志之后只执行一次
postrotate 将日志文件转储后执行的命令,以endscript结尾,命令需要单独成行
endscript 重启nginx日志服务,写入到新的文件中去,否则会依然写入重命名后的文件中
- 启动切割
#测试日志切割
logrotate -fv /etc/logrotate.d/nginx
#添加日志切割定时任务
(echo "0 1 * * * logrotate -fv /etc/logrotate.d/nginx > /dev/null 2>&1"; crontab -l) | crontab
日志切割-shell脚本
编辑切割脚本
mkdir -p /data/script/
cat > /data/script/nginx-rotate.sh << 'EOF'
#!/bin/bash
#注意:
#脚本应在凌晨执行,移动的是前一日的日志数据
# 你的日志文件存放目录
logs_path="/usr/local/nginx/logs/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access)
dates=`date -d "yesterday" +"%Y-%m-%d"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i<num;i++));do
mv ${logs_path}${logs_names[i]}.log ${logs_path}$dates/${logs_names[i]}.log
done
#nginx平滑重启
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
EOF
启用日志切割
#添加日志切割定时任务
(echo "0 1 * * * /data/script/nginx-rotate.sh > /dev/null 2>&1"; crontab -l) | crontab