阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux下定时切割Nginx日志并删除指定天数前的日志记录

239次阅读
没有评论

共计 4961 个字符,预计需要花费 13 分钟才能阅读完成。

nginx 的 log 日志分为 access.log 和 error.log;其中 access.log 记录了哪些用户、哪些页面以及用户浏览器、ip 和其他的访问信息;error.log 则是记录服务器错误日志.

error.log 日志 的形式如下:
201.158.69.116 – – [03/Jan/2013:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.007 0.007 MX Pythontab.com GET /html/test.html HTTP/1.1 “200” 2426 “http://a.com” “es-ES,es;q=0.8” “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”
187.171.69.177 – – [03/Jan/2013:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.006 0.006 MX pythontab.com GET /html/test2.html HTTP/1.1 “200” 2426 “http://a.com” “es-ES,es;q=0.8” “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”

从上面我们可以看出几部分信息:

1. 客户端(用户)IP 地址。如:上例中的 201.158.69.116

2. 访问时间。如:上例中的 [03/Jan/2013:21:17:20 -0600]

3. 访问端口。如:上例中的 127.0.0.1:9000

4. 响应时间。如:上例中的 0.007

5. 请求时间。如:上例中的 0.007

6. 用户地理位置代码(国家代码)。如:上例中的 MX(墨西哥)

7. 请求的 url 地址(目标 url 地址)的 host。如:上例中的 pythontab.com

8. 请求方式(GET 或者 POST 等)。如:上例中的 GET

9. 请求 url 地址(去除 host 部分)。如:上例中的 /html/test.html

10. 请求状态(状态码,200 表示成功,404 表示页面不存在,301 表示永久重定向等,具体状态码可以在网上找相关文章,不再赘述)。如:上例中的 “200”

11. 请求页面大小,默认为 B(byte)。如:上例中的 2426

12. 来源页面,即从哪个页面转到本页,专业名称叫做“referer”。如:上例中的 “http://a.com”

13. 用户浏览器语言。如:上例中的 “es-ES,es;q=0.8”

14. 用户浏览器其他信息,浏览器版本、浏览器类型等。如:上例中的  “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/53 7.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11”

access.log 日志 的格式不是一成不变的,是可以自定义的。在 nginx 的 nginx.conf 配置文件找到:log_format 这里就是日志的格式
    #log_format  main  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    #                  ‘$status $body_bytes_sent “$http_referer” ‘
    #                  ‘”$http_user_agent” “$http_x_forwarded_for”‘;

    #access_log  logs/access.log  main;

log_format 是 Nginx 的 HttpLog 模块指令,用于指定 Nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 指令中引用。

eg:
192.168.21.1 – – [27/Jan/2014:11:28:53 +0800] “GET /2.php HTTP/1.1” 200 133 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36” “-“192.168.21.128 200 127.0.0.1:9000 0.119 0.119

$remote_addr:客户端地址 192.168.21.1

$remote_user:客户端用户 –

$time_local:时间和时区 27/Jan/2014:11:28:53 +0800

$request:请求的 URL 路径和 HTTP 协议 GET /2.php HTTP/1.1

$status:HTTP 状态 200

$body_bytes_sent:发送给客户端页面大小 133

$http_referer:页面 跳转来源 –

$http_user_agent:用户访问终端 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36

$http_x_forwarded_for:HTTP 代理中,请求端真实 IP  –

$http_host:用户在浏览器中输入的 URL(IP 或着域名)地址 192.168.21.128

$upstream_status:upstream 状态 200

$upstream_addr:后端 upstream 地址及端口  127.0.0.1:9000

$request_time:页面访问总时间  0.119

$upstream_response_time:页面访问中 upstream 响应时间 0.119

如果在客户端和 Web 服务器之间增加了中间层(比如反向代理服务器),此时 Web 服务器无法直接拿到客户端的 lP,通过 $remote_addr 变量拿到的将是反向代理服务器的 IP 地址。但是,反向代理服务器在转发请求的 HTTP 头信息中,可以增加 X -Forwarded-For 信息,用以记录原有的客户端 lP 地址和原来客户端请求的服务器地址。

这时候,就要用 log_format 指令来设置日志格式,让日志记录 X -Forwarded-For 信息中的 lP 地址,即客户的真实 IP。例如,创建一个名为 mylogformat 的日志格式,再用 $http_x_forwarded_for 变量记录用户的 X -Forwarded-For lP 地址:
    log_format  mylogformat  ‘$http_x_forwarded_for – $remote_user [$time_local] “$request” ‘
                      ‘$status $body_bytes_sent “$http_referer” ‘
                      ‘”$http_user_agent” “$http_x_forwarded_for”‘;

如果不想记录日志,可以使用以下指令关闭日志记录:
 access_log off

nginx 日志文件的切割

生产环境中的服务器,由于访问日志文件增长速度非常快,日志太大会严重影响服务器效率。同时,为了方便对日志进行分析计算,须要对日志文件进行定时切割。定时切割的方式有按月切割、按天切割、按小时切割等。最常用的是按天切割。
Nginx 不支持像 Apache 一样使用 cronolog 来轮转日志,但是可以采用以下方式来实现日志文件的切割:
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_20150519084513.log 
 kill -USR1 Nginx 主进程号 
通过 mv 命令将日志文件重命名为 /usr/local/nginx/logs/access_20150519084513.log,然后发送 kill -USR1 信号给 Nginx 的主进程号,让 Nginx 重新生成一个新的日志文件 /usr/local/nginx/logs/access.log。
如果想每天定时切割日志,还须要借助 crontab。我们可以写一个按天切割的日志,按年、月份目录存放日志的 shell 脚本:
[root@localhost logs]# vim /usr/local/nginx/sbin/cut_nginx_log.sh

#!/bin/bash
logs_path=”/usr/local/nginx/logs/”
DAYS=30
mv ${logs_path}access.log ${logs_path}access_$(date -d “yesterday” +”%Y%m%d%H%M%S”).log
#mv ${logs_path}access.log ${logs_path}access_$(date +”%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒星期 %w”).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
find ${logs_path} -name “access_*.log” -type f -mtime +$DAYS -exec rm {} \;
[root@localhost logs]# chmod +x /usr/local/nginx/sbin/cut_nginx_log.sh
[root@localhost logs]# crontab -e
0 0 * * * /usr/local/nginx/sbin/cut_nginx_log.sh   
[root@localhost logs]# service crond restart
Stopping crond:                                            [OK]
Starting crond:                                            [OK]
[root@localhost logs]# chkconfig crond on
[root@localhost logs]#

如果脚本在执行过程中出现下面错误
nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed

解决办法:
[root@localhost logs]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

更多 Nginx 相关教程见以下内容

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-11/125067.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4961字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中