• Nginx日志管理之访问日志配置


            Nginx 的访问日志主要记录用户客户端的请求信息(见下表)。用户的每次请求都会记录在访问日志中,access_log 指令可以设置日志的输出方式及引用的日志格式。

    名称访问日志指令
    指令access_log
    作用域http、stream、server、location、if in location、limit except
    默认值logs/access.log combined;
    指令值格式off 或 path[format[buffer=size][gzip[=level]][flush=time][if=condition]];
    指令说明设置访问日志输出方式及引用的日志格式

            关于 access_log 指令有以下几点需要说明:

    • 在同一级别的指令域中,也可指定多个日志;
    • 指令值中的第一个参数用于设置输出日志的方式,默认是输出到本地的文件中。该指令也支持输出到 syslog 或内存缓冲区中;
    • 该指令在 stream 指令域中时,默认值为 off;
    access_log off;
    • 参数 path,设置日志输出的文件路径或 syslog 服务器地址;
    access_log logs/access.log combined;
    • 参数 format,设置关联 log_format 指令定义的日志格式名;
    • 参数 buffer,设置日志文件缓冲区大小。当缓冲区日志数据超出该值时,缓冲区日志数据会被写到磁盘文件。默认缓冲区大小为 64KB;
    • 参数 flush,设置日志缓冲区刷新的时间间隔,缓冲区日志的保护时间超过这个设定值时,缓冲区日志数据会被写到磁盘文件;
    • 参数 gzip,设置缓冲区数据的压缩级别,缓冲区数据会被压缩后再写出到磁盘文件。压缩级别范围 1~9,级别越高压缩比越高,系统资源消耗也最大,默认级别为 1;
    access_log logs/log.gz combined gzip flush=5m;
    • 参数 if,设置是否记录日志,当参数值的条件成立,即不为 0 或空时,才记录日志。
    1. map $status $loggable {
    2. ~^[23] 0;
    3. default 1;
    4. }
    5. access_log logs/access.log combined if=$loggable;

            日志格式指令如下表所示:

    名称日志格式指令
    指令log_format
    作用域http、stream
    默认值combined"...";
    指令值格式 name[escape=default 或 json 或 none]string...;
    指令说明设置访问日志输出方式及输出日志格式

             关于 log_format 指令有以下几点需要说明:

    • 指令值参数 name 用于设置日志格式名。该名称全局唯一,可以被 access_log 引用;
    • 指令值参数 escape 用于设置日志输出字符串编码格式,json 支持中文字符内容输出;
    • 指令值参数 string 用于设置日志输出格式字符串。该字符串由 Nginx 公共变量和仅在日志写入时存在的变量组成。HTTP 常用变量如下表所示。
    变量名变量说明
    $time_iso8601ISO 8601 时间格式
    $time_local用户请求的时间和时区
    $msec毫秒级别的日志记录时间
    $remote_addr发起与 Nginx 建立连接的网络客户端的 IP,有时会是上层代理服务器的 IP
    $http_x_forwarded_for可以记录客户端 IP,通过代理服务器来记录客户端的 IP
    $remote_user用于记录远程客户端的用户名称
    $http_user_agent用户客户端浏览器标识
    $connection网络连接编号
    $connection_requests当前连接的请求数
    $request用户请求的 URI 及请求方法
    $request_method用户请求方法
    $request_uri用户请求的 URI 及请求方法
    $server_protocol请求协议
    $request_time请求时间
    $request_length请求数据大小
    $status用户请求响应状态码
    $bytes_sent发送到客户端响应数据的大小
    $body_bytes_sent用户请求返回的响应体字节数
    $http_refererHTTP 请求头中属性字段 referer

    配置样例如下:

    1. # 普通格式日志
    2. log_format main '$remote_addr - $connection - $remote_user [$time_local] "$request" - $upstream_addr'
    3. '$status - $body_bytes_sent - $request_time - "$http_referer" '
    4. '"$http_user_agent" - "$http_x_forwarded_for" - ';
    5. # JSON格式日志
    6. log_format json '{"@timestamp": "$time_iso8601", '
    7. '"connection": "$connection", '
    8. '"remote_addr": "$remote_addr", '
    9. '"remote_user": "$remote_user", '
    10. '"request_method": "$request_method", '
    11. '"request_uri": "$request_uri", '
    12. '"server_protocol": "$server_protocol", '
    13. '"status": "$status", '
    14. '"body_bytes_sent": "$body_bytes_sent", '
    15. '"http_referer": "$http_referer", '
    16. '"http_user_agent": "$http_user_agent", '
    17. '"http_x_forwarded_for": "$http_x_forwarded_for", '
    18. '"request_time": "$request_time"}';

             Nginx TCP/UDP 的访问日志的变量与 HTTP 的访问日志的变量是不同的,TCP/UDP 常见日志变量如下表所示。

    变量名变量说明
    $time_iso8601ISO 8601 时间格式
    $time_local用户请求的时间和时区
    $connection网络连接编号
    $remote_addr发起与 Nginx 建立连接的网络客户端的 IP,有时会是上层代理服务器的 IP
    $server_addrNginx 服务器地址
    $server_portNginx 服务器端口
    $status用户请求响应状态码
    $upstream_addr被代理服务器地址
    $bytes_received接收字节数
    $bytes_sent发送字节数
    $session_time连接会话时间
    $proxy_protocol_addr代理协议地址
    $proxy_protocol_port代理协议端口

            Nginx 的 TCP/UDP 的日志处理是在连接处理阶段结束时才发生,所以 TCP/UDP 代理的访问日志只在连接关闭时才被记录。访问日志格式配置样例如下:

    1. # 普通格式日志
    2. log_format tcp '$remote_addr - $connection - [$time_local] $server_addr: $server_port '
    3. '- $status - $upstream_addr - $bytes_received - $bytes_sent - $session_time '
    4. '- $proxy_protocol_addr:$proxy_protocol_port ';
    5. # JSON格式日志
    6. log_format json '{"@timestamp": "$time_iso8601", '
    7. '"connection": "$connection", '
    8. '"remote_addr": "$remote_addr", '
    9. '"server_addr": "$server_addr:$server_port" '
    10. '"status": "$status" '
    11. '"upstream_addr": "$upstream_addr" '
    12. '"bytes_received": "$bytes_received" '
    13. '"bytes_sent": "$bytes_sent" '
    14. '"session_time": "$session_time" '
    15. '"proxy_protocol_addr": "$proxy_protocol_addr:$proxy_protocol_port" '}'

             打开日志缓存指令见下表:

    名称打开日志缓存指令
    指令open_log_file_cache
    作用域http、stream、server、location
    默认值off
    指令值格式off 或 max=N [inactive=time][min_uses=N][valid=time];
    指令说明设置存储日志文件描述符(文件句柄)的缓存

            关于 open_log_file_cache 指令有以下几点需要说明:

    • 默认配置下,Nginx 每次将缓冲区日志数据保存到磁盘中,都需要先打开文件并获得文件描述符,然后向该文件描述符的文件中写入日志数据,最后关闭该文件描述符的文件。该指令把打开文件的文件描述符(文件句柄)存储在缓存中,进而提升写入日志的效率;
    • 指令值 max 用于设置缓存中存储的文件描述符的最大数量,超过该值时,将按照 LRU 算法对缓存中文件描述符进行关闭;
    • 指令值参数 inactive 用于设置缓存中每个文件描述符存活的时间,默认为 10s;
    • 指令值参数 min_uses 用于设置可被缓存文件描述符的最小使用次数,默认为 1 次;
    • 指令值参数 valid 用于设置缓存检查频率,默认为 60s;
    • 指令值 off 用于关闭打开日志缓存的功能。
    1. open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
    2. logs/access.log combined;

  • 相关阅读:
    记账心得分享
    并发编程带来的安全性挑战之同步锁
    记一次DNS问题排查
    python基础知识整理 06-异常、模块和包
    智能客服系统的特点,智能客服系统的优势--ttkefu
    HTML5网页设计成品:汽车介绍特斯拉 (dreamweaver作业静态HTML网页设计模板)
    【】javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes
    鸿蒙Harmony应用开发—ArkTS声明式开发(触摸事件)
    Promise常用方法笔记
    如何在Windows 10/11中重置网络,以及重置后的注意事项有哪些
  • 原文地址:https://blog.csdn.net/qq_37278522/article/details/139823502