Nginx 日志

日志切割

方式一(推荐) : 使用 logrotate 做日志切割

[转+] 运维中的日志切割(logrotate)操作梳理

方式二: shell 脚本

由于 Nginx 的日志(包括 access 和 error)默认都是存放在一个文件夹内,当时间长了,日志文件体积越来越大,不易管理,可以自己写个脚本来处理,其实就是定时定点去把日志移动下位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
# 日志源目录
sourceDir='/webdata/logs/proj/'
# 日志备份目录
backDir='/webdata/logs/proj_backup/'
echo "split-logs start: $(date +%Y-%m-%d %H:%M:%S)"
ls $sourceDir | while read filename
do
mkdir -p "$backDir/$(date +%Y%m%d)/"
mv "$sourceDir/$filename" "$backDir/$(date +%Y%m%d)/"
echo "$sourceDir/$filename => $backDir/$(date +%Y%m%d)/$filename"
done
# 刷新nginx
kill -USR1 `cat /var/run/nginx.pid`
echo "split-logs end: $(date +%Y-%m-%d %H:%M:%S)"
echo "----------------"

有几个注意的:

  1. 日志源目录 - 该目录存放日志文件,如 access.log,error.log,当然如果你的站点比较多,可以用域名来进行分组,比如: web.access.log,web.error.log 。
  2. 日志备份目录 - 会以Ymd命名文件夹名存放在该目录。
  3. 刷新 Nginx - 由于是直接移动日志文件,移动后需要刷新下 Nginx 使其再生成日志文件,当然也可以 nginx -s reload ,但 reload 要比 kill 的慢,而 kill -USR1 是无损的。
  4. 定时任务 - 需要使用 root 帐户下使用 crontab -e 插入一条定时任务,定时 23:55 开始分割,后面是把错误和信息输出到指定文件,方便调试,如:
    1
    55 23 * * * sh /path/of/split-log >> /var/log/nginx/crontab.log 2>&1
    当然这只是日志切割的一种,还有很多种方法~

默认关闭 access log

在配置本地 nginx 开发环境时,发现一个问题,当 server 段不指定 access_log 时,并且 http 段中也未指定任何 access_log 参数时,它会默认写到logs/access.log 这个文件,也就是 access_log 默认值就是 logs/access.log,而且是所有 server 的访问日志。但 nginx 网站上我并未找到此配置的默认值。
如果我们不需要,在http段中加一行 access_log off; 然后在特定的server中配置自己想写入的日志。开发环境我默认不写日志,即不配置任何 access_log,需要时才打开。
nginx 的 http 段中,设置 access log:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http{
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 gzip '$remote_addr - $remote_user [$time_local] "$request" '
'$status $bytes_sent "$http_referer" '
'"$http_user_agent" "$gzip_ratio"';

log_format download '$remote_addr - $remote_user [$time_local] "$request" '
'$status $bytes_sent "$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
access_log off;
}

静态资源不记录日志

对于静态资源, 本地缓存 + 服务端变动验证, 并不对资源文件进行访问日志记录

1
2
3
4
5
6
7
location ~* \.(jpg|gif|png|jpeg|bmp|svg|eot|woff|woff2|ico|js|css)$
{
access_log off;
add_header Cache-Control "public, max-age=0, must-revalidate";
}


如果是反向代理的机器需要去掉 access_log 的记录, 则需要对静态资源进行设置和转发识别, 否则

  • 如果是反向代理, 需要加入转发, 否则就会在本地目录查找
  • 如果目标机器是根据主机头区分的, 需要添加主机头
    1
    2
    3
    4
    5
    6
    location ~* \.(jpg|gif|png|jpeg|bmp|svg|eot|woff|woff2|ico|js|css)$ {
    access_log off;
    add_header Cache-Control "public, max-age=0, must-revalidate";
    proxy_set_header Host $host;
    proxy_pass http://192.168.1.248:80;
    }
    参考文章 : nginx不记录js、css、图片等资源文件的访问日志

语雀镜像 : Nginx 日志 ,点此 提问

作者

Duoli

发布于

2022-04-20

更新于

2022-09-19

许可协议

评论