惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
G
Google Developers Blog
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
爱范儿
爱范儿
B
Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
博客园_首页
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

Hsu Yeung 的博客

三圣花市 | Hsu Yeung 的博客 网站支持 Live Photo 图片展示 | Hsu Yeung 的博客 梦 | Hsu Yeung 的博客 周末午餐 | Hsu Yeung 的博客 张家界 | Hsu Yeung 的博客 话剧《寻她芳踪·张爱玲》 | Hsu Yeung 的博客 博客自动生成文章目录 | Hsu Yeung 的博客 灭螂行动! | Hsu Yeung 的博客 张靓颖成都演唱会 | Hsu Yeung 的博客 最近对博客做的一些微调总结 | Hsu Yeung 的博客 Windows 上安装 Lua | Hsu Yeung 的博客 网站支持展示 B 站 iframe 视频 SpringBoot 中使用 RedisTemplate 存取整数值的坑 | Hsu Yeung 的博客 SQL JOIN 中 ON 与 WHERE 的区别 值得记录的一些工作近况 | Hsu Yeung 的博客 周传雄成都演唱会 | Hsu Yeung 的博客 并行操作导致获取数据库连接超时 | Hsu Yeung 的博客 风信子 | Hsu Yeung 的博客 Linux 安装并配置 Nginx | Hsu Yeung 的博客 郁金香土培结果 | Hsu Yeung 的博客 MySQL LEFT JOIN 右表有多条数据但只取最新的一条 | Hsu Yeung 的博客 获取数据库锁等待超时问题 | Hsu Yeung 的博客 从零开始挑选相机 | Hsu Yeung 的博客 郁金香 | Hsu Yeung 的博客 我的第一束花 | Hsu Yeung 的博客 快乐的一周 | Hsu Yeung 的博客 重庆,来了 | Hsu Yeung 的博客 散步 | Hsu Yeung 的博客 Git 工作区、暂存区、版本库之间的关系 | Hsu Yeung 的博客 Collectors.toMap() 操作 value 为 null 的情况
使用 logrotate 切割 nginx 日志
2024-04-15 · via Hsu Yeung 的博客

由于 nginx 默认的日志文件 access.log 和 error.log
随着使用时间的增长会导致文件大小越来越大,甚至用一些编辑器打开都会直接卡死。想着要是能和程序日志一样能够自动切割、归档该多好。于是在网上搜索一番后,决定采用
linux 自带的 logrotate 和 crontab 来实现这个功能。

本文操作服务器版本:CentOS Linux release 7.6.1810 (Core)

一、 安装 logrotate

查看本机是否已安装 logrotate

which logrotate

如果未安装:

  • 在基于 Debian 的系统上,可以运行:
    sudo apt-get install logrotate
    
  • 在基于Red Hat的系统上,可以运行:
    sudo yum install logrotate
    

二、新建 logrotate 配置文件

安装好后应该会有一个 /etc/logrotate.d 目录,cd 到该目录下,新建一个关于 nginx 日志切割规则的配置文件:

cd /etc/logrotate.d

vim nginx_log_rotate

在新建的文件中输入以下内容:

/usr/local/env/nginx/nginx-1.22.1/logs/*.log {
    daily
    dateext
    minsize 10M
    missingok
    rotate 365
    compress
    delaycompress
    create 0640 root root
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/env/nginx/nginx-1.22.1/logs/nginx.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

其中,部分常用参数表示的含义:

  • daily:表示每天切割一次日志,还支持 weekly(每周)、monthly(每月)
  • dateext:加上日期作为扩展名。
  • minsize 10M:文件大小达到 10M 才会进行切割。
  • missingok:如果日志文件不存在,不报错。
  • rotate 365:保留最近的 365 个日志文件。
  • compress:压缩旧的日志文件(默认使用 gzip)。
  • delaycompress:压缩的日志文件延迟压缩,以允许 Nginx 重新启动。
  • notifempty:如果日志文件为空,不切割(不推荐)。
  • create:创建新的日志文件时设置文件权限和所有者。
  • sharedscripts:在所有日志文件切割之后执行一次 postrotate 脚本。
  • postrotate:在切割后,需要执行的 shell 脚本,这里是发送 USR1 信号给 Nginx 以重新打开日志文件,以避免日志丢失。

更多更详细的配置可参考:日志 logrotate

三、配置定时任务

打开 crontab 文件:

vim /etc/crontab

写入以下命令:

# 每天 23:59 执行日志轮换操作,不选择 0 点是因为这时候日期已经跨天了,logrotate 归档时的日期就变成第二天了,这样归档出来的日期是不对的。
#  >/dev/null 2>&1 表示输出的信息不显示。
# -f 表示强制切割文件,即使日志文件的大小还不满足配置的最小值也会被切割
59 23 * * * root /usr/sbin/logrotate -f /etc/logrotate.d/nginx_log_rotate > /dev/null 2>&1

然后重启 crontab 即可:

systemctl restart crond