1. 闲不住的人首页
  2. 网站服务

Nginx日志轮询

一个非常繁忙的站点每天产生的日志量是非常巨大的,当我们需要查看某一天的日志记录时,日志文件过大会导致过滤指定内容非常的缓慢而且不易于查询。此时定时按天轮询 Nginx 的访问日志显得尤为重要。

本文演示使用 shell 脚本的方式实现 Nginx 日志轮询。

1. 说明

实际生产环境,一台 Nginx 服务器上往往有多个虚拟主机配置,本次实验模拟两个虚拟主机进行日志切割。

  • 站点1:www.a.com
  • 站点2:www.b.net

Nginx配置文件路径:

/etc/nginx/nginx.conf

站点1配置文件:

/etc/nginx/conf.d/www.a.com.conf

站点2配置文件:

/etc/nginx/conf.d/www.b.net.conf

2. 目的

1、对站点 1 和站点 2 的 nginx 访问日志按天保存,日志路径为:

  • 站点1:/data/logs/www.a.com
  • 站点2:/data/logs/www.b.net

2、只保留30天以内的日志记录

3. 具体操作

3.1 设置 Nginx 日志记录格式

root@opsbj-webserver:~ # vim /etc/nginx/nginx.conf
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
# 取消日志记录格式前面的注释,在最后一行添加一行,如下所示:
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"'
                '$http_host $upstream_status $upstream_addr $request_time $upstream_response_time'; # 新添加的一行

:wq! # 保存退出

3.2 设置虚拟主机配置文件

root@opsbj-webserver:~ # vim www.a.com.conf
server {
  listen 80;
  server_name www.a.com;
  access_log /data/logs/www.a.com/a_access.log main;
  index index.html index.htm;

  location / {
    root /data/www/a.com;
  }
}
:wq! #保存退出

root@opsbj-webserver:~ # vim www.b.net.conf
server {
  listen 80;
  server_name www.b.net;
  access_log /data/logs/www.b.net/b_access.log main;
  index index.html index.htm;

  location / {
    root /data/www/b.net;
  }
}
:wq! #保存退出

root@opsbj-webserver:~ # nginx -t # 检查配置文件语法
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@opsbj-webserver:~ # systemctl restart nginx.service # 重新加载nginx配置文件

4. 创建 Nginx 日志切割脚本

root@opsbj-webserver:~ # mkdir /data/scripts
root@opsbj-webserver:~ # vim /data/scripts/cut_nginx_log.sh # 编辑
#!/bin/bash
logs_path="/data/logs/"
DAYS=30

mv ${logs_path}www.a.com/a_access.log ${logs_path}www.a.com/a_access_$(date -d "yesterday" +"%Y%m%d").log
mv ${logs_path}www.b.net/b_access.log ${logs_path}www.b.net/b_access_$(date -d "yesterday" +"%Y%m%d").log

kill -USR1 `cat /var/run/nginx.pid`

find ${logs_path}www.a.com/ -name "a_access_*" -type f -mtime +$DAYS -exec rm {} \;
find ${logs_path}www.b.net/ -name "b_access_*" -type f -mtime +$DAYS -exec rm {} \;
:wq! #保存退出# 添加脚本执行权限

root@opsbj-webserver:~ # chmod +x /data/scripts/cut_nginx_log.sh

5. 手动执行脚本测试

root@opsbj-webserver:~ # /data/scripts/cut_nginx_log.sh
root@opsbj-webserver:~ # tree /data/logs/
/data/logs/
├── www.a.com
│   ├── a_access_20190420.log
│   └── a_access.log
└── www.b.net
    ├── b_access_20190420.log
    └── b_access.log

6. 添加任务计划

root@opsbj-webserver:~ # vim /etc/crontab
# cut nginx access_log
00 00 * * * root /bin/bash /data/scripts/cut_nginx_log.sh &>/dev/null

每天会在 /data/logs/www.a.com 和 /data/logs/www.b.net 目录下生成类似 a_access_20190420.log 和 b_access_20190420.log 的日志文件,并且只保留最近 30 天的日志记录。

至此,定时切割 Nginx 访问日志并删除指定天数前的日志记录完成。

如果觉得文章不错,不妨给个『打赏』写作不易,各位的支持,能激发和鼓励我更大的写作热情。谢谢

原创文章,作者:恩志,如若转载,请注明出处:https://www.xbzdr.com/580.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code