Nginx日志切割

目录

1. 手动切割

2. 脚本切割

日志切割工具(logrotate)


Nginx日志默认是不切割的,网站运行久了自然生成大量日志,导致单文件的处理,太麻烦,因此工作里一般定期切割,一般按天切割。

1. 手动切割

整体思路:

        将旧日志重命名,通常名字加上日志来区分不同时间端的日志,然后给nginx发送USR1信号让其在不重启的情况重新生成日志文件即可。

下载ab命令的工具包

sudo yum install -y httpd-tools

 使用ab工具多请求一些造成日志文件增大

ab -n 10000 -c 100 http://192.168.226.100/

这里是我现在的日志大小

[root@nginx ~]# du -sh /var/log/nginx/access.log
66M	/var/log/nginx/access.log

当前日志行数

[root@nginx ~]# cd /var/log/nginx/
[root@nginx nginx]# cat *access* | wc -l
411054

 将该文件当成旧日志,将其重命名

[root@nginx nginx]# mv access.log "$(date +'%Y-%m-%d')-access.log"

[root@nginx nginx]# ll
总用量 40576
-rw-r--r-- 1 nginx root 41542550 8月  22 03:35 2024-08-22-access.log
-rw-r--r-- 1 nginx root      446 8月  22 03:30 error.log

给nginx进程发送reopen信号,重新生成新日志继续记录

这个命令能够确保你精确地找到主进程的 PID,并进行相应的操作。

[root@nginx nginx]# kill -USR1 $(ps -ef | grep '[n]ginx: master' | awk '{print $2}')


此时会生成新的日志文件access.log

[root@nginx nginx]# ll
总用量 40576
-rw-r--r-- 1 nginx root 41542550 8月  22 03:35 2024-08-22-access.log
-rw-r--r-- 1 nginx root        0 8月  22 03:43 access.log
-rw-r--r-- 1 nginx root      446 8月  22 03:30 error.log
对于旧的日志你最好创建文件夹去分类管理他们。

2. 脚本切割

#!/bin/bash

# Nginx 日志目录和日志文件
LOG_DIR="/var/log/nginx"
ACCESS_LOG="${LOG_DIR}/access.log"
ERROR_LOG="${LOG_DIR}/error.log"

# 切割日志的时间戳,格式为 YYYY-MM-DD-HH-MM-SS
TIMESTAMP=$(date +"%Y-%m-%d-%H-%M-%S")

# 创建一个备份目录(如果需要的话)
BACKUP_DIR="${LOG_DIR}/backup"
mkdir -p "${BACKUP_DIR}"

# 备份当前日志文件
cp "${ACCESS_LOG}" "${BACKUP_DIR}/access.log.${TIMESTAMP}"
cp "${ERROR_LOG}" "${BACKUP_DIR}/error.log.${TIMESTAMP}"

# 清空原始日志文件
> "${ACCESS_LOG}"
> "${ERROR_LOG}"

# 发送 USR1 信号以重新打开日志文件
kill -USR1 $(ps -ef | grep '[n]ginx: master' | awk '{print $2}')

echo "日志切割完成: ${TIMESTAMP}"

给脚本加上执行权限

sudo chmod +x /var/log/nginx/cut-log.sh

设置定时任务,每天午夜执行。

0 0 * * * /var/log/nginx/cut-log.sh

扩展:还有另外一种设置定时执行的方式:systemd形式

给脚本加上执行权限

sudo chmod +x /var/log/nginx/cut-log.sh

1. 创建服务单元文件

[root@nginx ~]# vim /etc/systemd/system/nginx-log-rotate.service
[Unit]
Description=Rotate Nginx logs

[Service]
Type=oneshot
ExecStart=/var/log/nginx/cut-log.sh

2. 创建定时器单元文件

[root@nginx ~]# vim /etc/systemd/system/nginx-log-rotate.timer
[Unit]
Description=Run Nginx log rotation daily

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

任务将在每天的03:00:00触发执行

3. 重新加载 systemd 配置

sudo systemctl daemon-reload

4. 启用定时器

sudo systemctl enable --now nginx-log-rotate.timer

5. 检查定时器状态

sudo systemctl status nginx-log-rotate.timer

相比于 cronsystemd 定时任务(systemd timers)通常更为精确和可靠。systemd 作为一个现代的系统和服务管理器,提供了更精细的定时任务控制,并且在执行任务时具有更好的准确性。

日志切割工具(logrotate)

logrotate 是最常用的日志切割工具,几乎在所有 Linux 发行版中都可以找到。它允许你定期轮换、压缩和删除日志文件。配置文件通常位于 /etc/logrotate.conf/etc/logrotate.d/ 目录中。

安装

sudo yum install -y logrotate
[root@nginx ~]# cd /etc/logrotate.d/
[root@nginx logrotate.d]# vim nginx
/var/log/nginx/*.log {
    daily
    # 每天切割日志

    rotate 15
    # 最多保留15个日志文件

    compress
    # 切割后压缩日志文件

    delaycompress
    # 延迟到下次切割时再压缩

    missingok
    # 忽略文件不存在的错误

    notifempty
    # 如果日志文件为空,则不进行轮转

    dateext
    # 在生成的日志文件名中使用日期作为后缀

    dateformat -%Y-%m-%d-%s
    # 使用自定义的日期作为日志文件的后缀

    sharedscripts
    # 所有日志文件共享一个postrotate脚本

    postrotate
    # 日志轮转后的操作
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
            # 向NGINX主进程发送USR1信号
        fi
    endscript
    # 结束postrotate部分
}

压测访问日志

yum install httpd-tools -y
ab -n 10000 -c 100 http://192.168.226.100/
[root@nginx logrotate.d]# cd /var/log/nginx/
[root@nginx nginx]# ll
总用量 1984
-rw-r--r-- 1 root root 2020000 8月  21 11:48 access.log
-rw-r--r-- 1 root root       0 8月  21 11:48 error.log

现在使用该工具强制轮转验证(第一次轮转的文件不会压缩,延迟到下次切割时再压缩)

logrotate -f /etc/logrotate.d/nginx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZDICT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值