linux nginx 日志切割

本文介绍了一个用于按小时切割Nginx日志文件的Shell脚本。该脚本会将access.log、error.log及watchdog.log等日志文件按照时间戳进行归档,并通过发送USR1信号来触发Nginx重新打开日志文件。

 

cutlog.sh
用于切割日志文件,按照小时切割。
#!/bin/bash

logdir="/usr/local/nginx/logs"
pid=`cat $logdir/nginx.pid`
DATE=`date -d "1 hours ago" +%Y%m%d%H`
DATE_OLD=`date -d "30 days ago" +%Y%m%d`
for i in `ls $logdir/*access.log`; do
         mv $i $i.$DATE
done
for i in `ls $logdir/*error.log`; do
        mv $i $i.$DATE
done
for i in `ls $logdir/*watchdog.log`; do
        mv $i $i.$DATE
done
kill -s USR1 $pid

 

 

<think>我们之前已经讨论过不使用第三方工具和脚本按天切割Nginx日志的方法,主要是通过手动重命名日志文件并发送USR1信号给Nginx主进程。现在用户再次询问相同的问题,可能是希望得到一个更简洁的总结或者确认步骤。 根据用户提供的引用,虽然提到了脚本(如引用[3]中的脚本),但用户明确要求不使用第三方工具和脚本。因此,我们将坚持使用手动命令和cron定时任务的方法。 核心步骤: 1. 重命名当前日志文件:将日志文件移动到带有日期的文件中(例如,使用昨天的日期)。 2. 发送USR1信号给Nginx进程,使其重新打开日志文件(这样新的日志会写入到新的文件中)。 但是,我们要注意,不使用脚本意味着我们不能写一个shell脚本然后执行,而是直接使用命令行。我们可以将命令组合成一行,然后放在cron中执行。 具体操作: 步骤1:重命名日志文件 使用`mv`命令重命名日志文件,并加上日期后缀。例如,将access.log重命名为access-20240605.log(假设昨天是2024年6月5日)。 步骤2:发送USR1信号 使用`kill -USR1`命令,后面跟上Nginx主进程的PID。PID可以从Nginx的pid文件中获取,通常位于`/var/run/nginx.pid`。 组合命令(每天零点执行): ``` 0 0 * * * mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log && mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid) ``` 注意: 1. 确保Nginx日志目录存在且Nginx有写入权限。 2. 上述命令假设Nginx日志文件为`/var/log/nginx/access.log`和`/var/log/nginx/error.log`,pid文件为`/var/run/nginx.pid`。如果路径不同,请修改。 3. 如果系统没有`date -d "yesterday"`选项(如某些BSD系统),可以使用`date -v-1d +%Y%m%d`。 另外,为了确保命令执行成功,我们可以分开两步,先重命名再发信号。因为重命名两个日志文件,中间用`&&`连接表示前一个成功才执行下一个,最后发送信号。 但是,用户要求不使用脚本,所以我们不能写一个脚本文件,但我们可以将上述命令直接放入cron中。 关于权限:通常,这些操作需要root权限,所以应该以root用户设置cron任务(使用`sudo crontab -e`)。 此外,我们还可以考虑在重命名后压缩旧日志文件以节省空间,但用户没有要求,且压缩需要额外的命令(如gzip),这里不展开。 总结回答: 在Linux系统下,不使用第三方工具和脚本按天切割Nginx日志,可以通过以下步骤实现: 1. 手动重命名日志文件:使用`mv`命令将当前日志文件重命名为带日期的文件(例如昨天的日期)。 2. 发送USR1信号:使用`kill -USR1`命令通知Nginx重新打开日志文件。 为了每天自动执行,可以将这两个步骤组合成一行命令,并添加到cron定时任务中。 具体命令如下(以root用户执行): ```bash # 重命名访问日志和错误日志,并发送信号 mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log && mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid) ``` 设置cron任务: 1. 使用`crontab -e`命令编辑当前用户的cron表(如果是root用户,则使用`sudo crontab -e`)。 2. 添加一行: ``` 0 0 * * * mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log && mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid) ``` 注意事项: - 确保命令中的路径(日志路径和pid文件路径)与您的系统配置一致。 - 如果系统不支持`date -d "yesterday"`(例如Alpine Linux或BSD系统),可以使用`date -v-1d +%Y%m%d`(Mac OS X和FreeBSD)或者调整日期格式。对于不支持`-d`的系统,也可以考虑使用`$(date +%Y%m%d -d "1 day ago")`,或者使用`$(date +%Y%m%d)`然后通过调整cron执行时间(比如在23:59执行)来获取当天的日志,但这样可能会丢失最后一分钟的日志。通常,我们选择在零点切割,使用昨天的日期命名。 另外,切割后的日志文件不会自动删除,需要另外设置清理策略(比如使用`find`命令删除30天前的日志)。 最后,生成相关问题。 </think>### Linux系统下Nginx按日切割日志的方法 在Linux系统中,不使用第三方工具和脚本实现Nginx日志按日切割,可通过以下步骤完成。核心原理是利用系统内置命令和Nginx信号机制实现日志轮转,并通过cron定时任务实现自动化。 #### 操作步骤 1. **重命名当前日志文件** 使用`mv`命令将当前日志文件重命名为带日期后缀的文件: ```bash mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log ``` - `date -d "yesterday" +%Y%m%d`生成昨日日期(如20240605) - 确保Nginx日志路径正确(默认为`/var/log/nginx/`)[^3] 2. **通知Nginx重新打开日志文件** 向Nginx主进程发送`USR1`信号: ```bash kill -USR1 $(cat /var/run/nginx.pid) ``` - 此信号使Nginx关闭旧日志文件并创建新文件(同名文件`access.log`和`error.log`)[^1][^3] - 验证PID文件路径:通常在`/var/run/nginx.pid`或`/usr/local/nginx/logs/nginx.pid` 3. **设置定时任务(每日自动执行)** 使用cron实现每日00:00自动切割: ```bash crontab -e ``` 添加以下内容: ``` 0 0 * * * mv /var/log/nginx/access.log /var/log/nginx/access-$(date -d "yesterday" +%Y%m%d).log && mv /var/log/nginx/error.log /var/log/nginx/error-$(date -d "yesterday" +%Y%m%d).log && kill -USR1 $(cat /var/run/nginx.pid) ``` #### 关键原理 - **信号机制**: `USR1`信号使Nginx重新打开日志文件而不中断服务,符合$\text{进程ID} \rightarrow \text{文件描述符}$的底层机制[^1][^3] - **日期计算**: 使用`date -d "yesterday"`确保切割的是完整日期的日志 - **文件管理**: 重命名不影响正在写入的文件,因Linux通过inode标识打开文件 #### 注意事项 1. **权限要求** - 需root权限操作日志文件和发送信号 - 确保cron任务以root用户设置(`sudo crontab -e`) 2. **路径验证** ```bash # 确认日志路径 grep "access_log" /etc/nginx/nginx.conf # 确认PID路径 grep "pid" /etc/nginx/nginx.conf ``` 3. **日志清理(可选)** 添加find命令删除旧日志(例如保留30天): ``` 0 0 * * * ... && find /var/log/nginx/ -name "access-*.log" -mtime +30 -delete ``` 4. **特殊情况处理** - 若系统不支持`date -d`(如BSD),改用: `$(date -v-1d +%Y%m%d)` - PID文件丢失时,改用: `kill -USR1 $(ps aux | grep nginx | grep master | awk '{print $2}')` #### 验证方法 ```bash # 检查新日志文件 ls -l /var/log/nginx/access.log # 实时查看日志写入 tail -f /var/log/nginx/access.log ``` 此方法仅依赖Linux内置命令(mv/date/kill/cron)和Nginx信号机制,完全避免第三方工具,实现高效可靠的日志切割[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值