linux存在很好的日志机制,大到系统,小到应用都可以记录日志。
操作系统(Windows,Unix),应用一般都会记录日志,方便使用者常看系统或应用使用情况,或者排查故障。
单纯的记录日志不加干预,日志不断累积,时间长了,磁盘空间就被占满了。
所以,在linux中,日志一般会按一定的规则进行循环,保证日志量控制在一定的范围内。
日志循环的原理一般是:在特定的时间点,或日志达到一定大小,就触发循环脚本。
循环脚本通过新增新日志,备份老日志,调度应用重新加载配置(重新写日志)达到日志循环的目的。
通过脚本执行的日志循环,常见的方法一般分为有损循环和无损循环两种形式。
以nginx日志循环为例,nginx作为常用的代理转发服务器,每天承载上万级甚至百万级的量,正常情况下几天就可能把100G的磁盘打满。
据了解,nginx没有内置的日志循环配置(apache好像有)。
直接清理日志
cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_$(date -d '-1day' '+%Y-%m-%d').log
echo > /usr/local/nginx/logs/access.log
配合定时任务
0 0 * * * cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.1 && echo > /usr/local/nginx/logs/access.log
该方法通过cp+echo的方式到达日志循环的效果。
好处是:
坏处是:
之所以称之为有损循环,是因为echo >
命令执行时,nginx工作进程依然在打印日志,这时候会出现两种可能:
因此,不推荐使用该方法
crontab设置
crontab -e
0 0 * * * /data/op_shell/nginx_log_division.sh
nginx_log_division.sh
#!/bin/bash
#设置日志文件存放目录
logs_path="/usr/local/nginx/logs/"
#设置pid文件(也有可能在/var/run中)
pid_path="/usr/local/nginx/logs/nginx.pid"
#日志文件
filepath=${logs_path}"access.log"
#重命名日志文件
mv ${logs_path}access.log ${logs_path}access_$(date -d '-1 day' ' +%Y-%m-%d'.log
#向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`
该方法通过mv+kill的方式进行日志循环,因为linux中,日志打开底层原理是通过inode信息寻址找到对应的block进行内容读取,mv操作不改变文件的inode值。
首先日志mv重命名,期间nginx依然打印日志到重命名的文件中,通过kill向nginx master进程发送信号,nginx重新读取配置文件,触发新的access日志重新打印。
两种方法存在以下问题:
logrotate是一个日志循环的工具,linux内置的syslog也是使用它进行日志循环。
logrotate的配置存放于/etc/logrotate.d
中
[root@zero /etc/logrotate.d]# ll /etc/logrotate.d/
total 32
-rw-r--r-- 1 root root 289 Jun 22 2016 conman
-rw-r--r-- 1 root root 194 Jul 18 2016 httpd
-rw-r--r-- 1 root root 136 Jun 22 2016 iptraf-ng
-rw-r--r-- 1 root root 893 Aug 12 2016 mariadb
-rw-r--r-- 1 root root 140 Oct 23 2014 mgetty
-rw-r--r-- 1 root root 409 Jun 22 2016 psacct
-rw-r--r-- 1 root root 224 Nov 5 2016 syslog
-rw-r--r-- 1 root root 100 Oct 12 2017 yum
添加nginx配置
/data/log/nginx/*log {
hourly
rotate 5
missingok
notifempty
nocompress
sharedscripts
postrotate
[ -f /data/log/nginx/nginx.pid ] && kill -USR1 `cat /data/log/nginxnginx.pid`
endscript
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。