使用newsyslog管理MacOS上Nginx的日志

事件起源

一切的开始是某一天mac突然报错内存不足🤷‍♂️,一番顺藤摸瓜后发现是我在mac上设置的nginx反代,放了两天就给我整出165gb的access.log,原因未知。

至于为什么是拍屏幕而不是截屏,那是因为空间真的一点不剩了,截不出来😅

165gb的nginx access.log文件

部署newsyslog自动日志轮转

/etc/newsyslog.d/ 下面添加配置文件即可配置日志配置轮转

比如:

sudo vim /etc/newsyslog.d/nginx

在里面添加以下内容

# logfilename                          [owner:group]   mode  count size  when  flags [/pid_file]                    [sig_num]
/usr/local/var/log/nginx/access.log     example:admin  644   5     1024  @T00  JCD    /usr/local/var/run/nginx.pid
/usr/local/var/log/nginx/error.log      example:admin  644   5     1024  @T00  JCD    /usr/local/var/run/nginx.pid

注意把example换成运行nginx的用户名,尽量别留空(对于mac的newsyslog,留空通常会默认为root),不然nginx可能没有权限写入日志

然后测试、重启nginx

# 测试配置
sudo nginx -t -c /usr/local/etc/nginx/nginx.conf

# 重启 nginx
sudo nginx -s stop
sudo nginx

# 强制 newsyslog 立即运行
sudo newsyslog -F

配置结构解读

1. ​日志文件路径

  • /usr/local/var/log/nginx/access.log- Nginx 访问日志
  • /usr/local/var/log/nginx/error.log- Nginx 错误日志

2. ​所有者设置[owner:group](可选,但建议选)

  • example:admin- 日志文件的所有者为 example用户,属于 admin

3. ​文件权限mode

  • 644- 文件权限为 -rw-r--r--
  • 所有者可读写,其他用户只读

4. ​保留数量count

  • 5- 保留 5 个旧的日志文件副本

5. ​文件大小阈值size

  • 1024- 当日志文件达到 1024KB (1MB) 时触发轮转

6. ​时间条件when

  • @T00- 每天午夜 00:00 进行轮转

7. ​标志位flags

  • J- 使用 bzip2 压缩旧日志文件
  • C- 如果日志文件不存在,则创建新文件
  • D- 在压缩前创建文件的副本

8. ​进程ID文件[/pid_file](可选)

  • /usr/local/var/run/nginx.pid- Nginx 主进程的 PID 文件路径
  • 轮转后向 nginx 发送信号重新打开日志文件

 

更多信息可参考OpenBSD提供的newsyslog文档

配置的实际作用

这个配置定义了:

  1. 轮转条件​:日志文件达到 1MB ​​ 每天午夜时轮转
  2. 文件管理​:保留 5 个压缩的旧日志文件(如 access.log.0.bz2, access.log.1.bz2等)
  3. 权限控制​:确保新创建的日志文件有正确的权限
  4. 进程通知​:轮转后通知 nginx 重新打开日志文件

 

上一篇 《世界尽头的咖啡馆》读书笔记