nginx 日志怎么定时切割

发布时间:2021-07-12 11:00:40 作者:chen
来源:亿速云 阅读:178
# nginx 日志怎么定时切割

## 为什么需要日志切割

Nginx作为高性能的Web服务器,默认会将所有访问日志和错误日志写入单个文件(如`access.log`和`error.log`)。长期运行会导致:

1. **日志文件过大**:可能占用数十GB磁盘空间
2. **检索困难**:大文件难以用文本工具打开分析
3. **影响性能**:频繁写入大文件可能降低I/O效率
4. **维护不便**:无法按时间维度归档历史日志

日志切割(Log Rotation)通过定期分割、压缩和归档日志文件解决这些问题。

---

## 手动切割方案

### 1. 使用mv+reload基础方法

```bash
# 重命名当前日志文件
mv /var/log/nginx/access.log /var/log/nginx/access_$(date +%Y%m%d).log

# 发送USR1信号让Nginx重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)

缺点:需要手动操作,不适合生产环境


2. 使用logrotate工具

Linux系统自带的logrotate是更专业的解决方案:

配置示例(/etc/logrotate.d/nginx)

/var/log/nginx/*.log {
    daily                      # 按天切割
    missingok                 # 日志不存在时不报错
    rotate 30                 # 保留30个历史版本
    compress                  # 使用gzip压缩
    delaycompress             # 延迟一天压缩
    notifempty                # 空文件不切割
    sharedscripts             # 所有日志处理完后执行脚本
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
    dateext                   # 使用日期作为后缀
    dateformat -%Y%m%d        # 日期格式
}

关键参数说明

参数 作用
size 100M 按大小切割
hourly 每小时切割(需安装cronhourly)
weekly 按周切割
monthly 按月切割
create 0640 www-data adm 设置新日志文件权限

测试配置

# 调试模式测试(不实际执行)
logrotate -d /etc/logrotate.d/nginx

# 强制立即运行
logrotate -vf /etc/logrotate.d/nginx

自动化定时任务

1. 使用crontab

# 每天凌晨执行
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx

2. 使用systemd timer(现代Linux系统)

创建/etc/systemd/system/nginx-logrotate.timer

[Unit]
Description=Daily rotation of Nginx logs

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

服务单元/etc/systemd/system/nginx-logrotate.service

[Unit]
Description=Nginx log rotation

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.d/nginx

启用定时器:

systemctl enable --now nginx-logrotate.timer

高级配置技巧

1. 按小时切割

/var/log/nginx/*.log {
    hourly
    rotate 24
    dateext
    dateformat -%Y%m%d%H
    ...
}

需确保/etc/cron.hourly/有logrotate任务。

2. 日志文件权限控制

create 0640 www-data adm

3. 自定义归档路径

olddir /var/log/nginx/archive/

4. 日志分析前处理

prerotate
    /usr/bin/nginx-log-analyser /var/log/nginx/access.log > /tmp/last_report
endscript

常见问题解决

Q1:切割后nginx不写入新日志

解决方法: 1. 确认postrotate脚本正确执行 2. 检查nginx进程用户有日志目录写入权限 3. 使用lsof | grep nginx确认文件描述符是否释放

Q2:磁盘空间不足

建议

rotate 7
size 500M

Q3:时区问题导致日期错误

# 在logrotate配置前添加
export TZ=Asia/Shanghai

性能优化建议

  1. 延迟压缩:使用delaycompress避免高峰时段CPU占用
  2. 异步处理:对于大流量站点,考虑先mv日志再异步压缩
  3. 分布式日志:高并发环境建议使用ELK等集中式日志方案

总结

Nginx日志切割最佳实践组合: 1. logrotate作为核心工具 2. crontab/systemd timer实现自动化 3. 合理的保留策略(时间+大小双重限制) 4. 完善的监控(日志增长报警)

通过合理配置,可以确保: ✓ 日志文件大小可控 ✓ 历史数据可追溯 ✓ 系统性能不受影响 ✓ 存储空间高效利用 “`

(全文约1300字)

推荐阅读:
  1. nginx日志切割脚本
  2. 5、nginx日志切割和删除

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx

上一篇:Java中SimpleDateFormat类和List接口的使用

下一篇:django怎么自定义权限系统

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》