详解Nginx访问日志access_log配置(推荐)

目录
文章目录隐藏
  1. Nginx 访问日志 access_log 配置及信息
  2. access_log
  3. nginx 日志调试技巧
  4. Nginx 配置访问日志过程
  5. 常用例子
  6. 统计信息

当你设置日志级别成 debug,如果你在调试一个在线的高流量网站的话,你的错误日志可能会记录每个请求的很多消息,这样会变得毫无意义,下面码云笔记给大家介绍 Nginx 访问日志 access_log 配置及信息详解,希望对大家提供参考。

Nginx 访问日志 access_log 配置及信息

Nginx 访问日志主要有两个参数控制:

  1. log_format #用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可);
  2. access_log #用来指定日至文件的路径及使用的何种日志格式记录日志。
#    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 的默认值:

#access_log  logs/access.log  main;

log_format 语法格式及参数语法说明

log_format    <NAME>    <Strin­­­g>;
  • log_format 关键字:其中关键字 error_log 不能改变
  • <NAME>格式标签:格式标签是给一套日志格式设置一个独特的名字
  • <Strin­­­g>日志格式:给日志设置格式

作用域 : http

例子:

log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;

log_format 格式变量

参数 说明 例子
$remote_addr 客户端地址 211.28.65.253
$remote_user 客户端用户名称
$time_local 访问时间和时区 25/Apr/2024:10:00:01 +0800
$request 请求的 URI 和 HTTP 协议 “GET /article-10000.html HTTP/1.1”
$http_host 请求地址,即浏览器中你输入的地址(IP 或域名) www.mybj123.com (59.110.168.178)
$status HTTP 请求状态 200
$upstream_status upstream 状态 200
$body_bytes_sent 发送给客户端文件内容大小 1547
$http_referer url 跳转来源 https://www.mybj123.com/
$http_user_agent 用户终端浏览器等信息 “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol SSL 协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台 upstream 的地址 ,即真正提供服务的主机地址 10.10.10.100:80
$request_time 整个请求的总时间 0.205
$upstream_response_time 请求过程中,upstream 响应时间 0.002

access_log

语法格式及参数语法说明

access_log    <FILE>    <NAME>;
  • access_log 关键字:其中关键字 error_log 不能改变
  • <FILE> 日志文件:可以指定任意存放日志的目录
  • <NAME> 格式标签:给日志文件套用指定的日志格式

其他语法:

access_log off; #关闭 access_log,即不记录访问日志
access_log path [format [buffer=size [flush=time]] [if=condition]];
access_log path format gzip[=level] [buffer=size] [flush=time] [if=condition];
access_log syslog:server=address[,parameter=value] [format [if=condition]];

说明:

  • buffer=size #为存放访问日志的缓冲区大小
  • flush=time #为缓冲区的日志刷到磁盘的时间
  • gzip[=level] #表示压缩级别
  • [if = condition] #表示其他条件

作用域(参数的标签段位置) :

http, server, location, if in location, limit_except

例子:

access_log /spool/logs/nginx-access.log compression buffer=32k;

open_log_file_cache

使用open_log_file_cache来设置日志文件缓存(默认是 off)。

  • max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用 LRU 算法将描述符关闭。
  • inactive:设置存活时间,默认是 10s
  • min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次
  • valid:设置检查频率,默认 60s
  • off:禁用缓存

语法格式:

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;

默认值: open_log_file_cache off;
作用域: http, server, location

举例:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

参考资料:点击这里

nginx 日志调试技巧

设置 Nginx 仅记录来自于你的 IP 的错误

当你设置日志级别成 debug,如果你在调试一个在线的高流量网站的话,你的错误日志可能会记录每个请求的很多消息,这样会变得毫无意义。

events{…}中配置如下内容,可以使 Nginx 记录仅仅来自于你的 IP 的错误日志。

events {
        debug_connection 1.2.3.4;
}

调试 nginx rewrite 规则

调试rewrite规则时,如果规则写错只会看见一个 404 页面,可以在配置文件中开启nginx rewrite日志,进行调试。

server {
        error_log    /var/logs/nginx/example.com.error.log;
        rewrite_log on;
}

rewrite_log on; 开启后,它将发送所有的 rewrite 相关的日志信息到 error_log 文件中,使用 [notice] 级别。随后就可以在 error_log 查看 rewrite 信息了。

使用 location 记录指定 URL 的日志

server {
        error_log    /var/logs/nginx/example.com.error.log;
        location /static/ { 
        error_log /var/logs/nginx/static-error.log debug; 
    }         
}

Nginx 配置访问日志过程

(1)创建 log_format 语句

worker_processes  1;
error_log logs/error.log error;
events {
    worker_connections  1024;
}
http {
    include status.conf;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    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;
    server {
        listen       80;
        server_name  localhost;
                rewrite ^/.* http://www.mybj123.com permanent;
    }
    include vhost/*.conf;
}

(2)插入 access_log 语句

server {
        access_log /data/log/www;
        listen 80;
        server_name abc.com www.mybj123.com;
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.mybj123.com.log    error;
        access_log    logs/access_www.mybj123.com.log    main;
        #新增内容↑
}

(3)重启服务

nginx -t
nginx -s reload

常用例子

main 格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                       '$upstream_addr $upstream_response_time $request_time ';
access_log  logs/access.log  main;

json 格式

log_format logstash_json '{"@timestamp":"$time_iso8601",'
       '"host": "$server_addr",'
       '"client": "$remote_addr",'
       '"size": $body_bytes_sent,'
       '"responsetime": $request_time,'
       '"domain": "$host",'
       '"url":"$request_uri",'
       '"referer": "$http_referer",'
       '"agent": "$http_user_agent",'
       '"status":"$status",'
       '"x_forwarded_for":"$http_x_forwarded_for"}';

解释:

uri 请求中的当前 uri(不带请求参数,参数位于 uri 请求中的当前 URI(不带请求参数,参数位于 uri 请求中的当前 URI(不带请求参数,参数位于 args),不同于浏览器传递的$request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改。不包括协议和主机名,例如/foo/bar.html。

requesturi 这个变量等于包含一些客户端请求参数的原始 uri,它无法修改,请查看 request—_uri 这个变量等于包含一些客户端请求参数的原始 URI,它无法修改,请查看 requestu​ri 这个变量等于包含一些客户端请求参数的原始 URI,它无法修改,请查看 uri 更改或重写 URI。

也就是说:requesturi 是原始请求 url,request_uri 是原始请求 URL, requestu​ri 是原始请求 URL,uri 则是经过 nginx 处理请求后剔除参数的 URL,所以会将汉字表现为 union。

坑点:

使用 uri 可以在 nginx 对 url 进行更改或重写,但是用于日志输出可以使用 uri 可以在 nginx 对 URL 进行更改或重写,但是用于日志输出可以使用 uri 可以在 nginx 对 URL 进行更改或重写,但是用于日志输出可以使用 request_uri 代替,如无特殊业务需求,完全可以替换。

压缩格式

日志中增加了压缩的信息。

http {
    log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    server {
        gzip on;
        access_log /spool/logs/nginx-access.log compression;
        ...
    }
}

upstream 格式

增加 upstream 消耗的时间。

http {
    log_format upstream_time '$remote_addr - $remote_user [$time_local] '
                             '"$request" $status $body_bytes_sent '
                             '"$http_referer" "$http_user_agent"'
                             'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
    server {
        access_log /spool/logs/nginx-access.log upstream_time;
        ...
    }
}

统计信息

统计 status 出现的次数

awk '{print $9}' access.log | sort | uniq -c | sort -rn
36461 200 
483 500
87 404
9 400
3 302
1 499
1 403
1 301

显示返回 302 状态码的 URL。

awk '($9 ~ /302/)' access.log | awk '{print $7}' | sort | uniq -c | sort -rn
1 /wp-login.php
1 /wp-admin/plugins.php?action=activate&plugin=ewww-image-optimizer%2Fewww-image-optimizer.php&_wpnonce=cc4a379131
1 /wp-admin/

到此,这篇关于 Nginx 访问日志 access_log 配置及信息详解的文章就介绍到这了,希望对大家有帮助,感谢阅读。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 详解Nginx访问日志access_log配置(推荐)

发表回复