nginx日志配置

一、日志配置

1.1 访问日志

access_log指令

语法
access_log 日志文件路径 日志格式

定义日志格式的指令log_format

Syntax: log_format 日志名 日志格式

log_format的定义位置:定义在http块内
log_format定义的日志在何处使用:server块内

日志格式相关参数

$remote_addr        # 记录客户端IP地址
$remote_user        # 记录客户端用户名
$time_local         # 记录通用的本地时间
$time_iso8601       # 记录ISO8601标准格式下的本地时间
$request            # 记录请求的方法以及请求的http协议
$status             # 记录请求状态码(用于定位错误信息)
$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent         # 发送给客户端的总字节数
$msec               # 日志写入时间。单位为秒,精度是毫秒。
$http_referer       # 记录从哪个页面链接访问过来的
$http_user_agent    # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录经过的所有服务器的IP地址
$X-Real-IP         #记录起始的客户端IP地址和上一层客户端的IP地址
$request_length     # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time       # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。

示例

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  custom  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        '"$host" "$http_cookie"';

    server {
        listen       80;
        server_name  localhost;

        access_log  logs/access.log  main;      # 使用main日志格式记录访问日志
        error_log   logs/error.log;   # 记录错误日志

        location / {
            root   /var/www/html;
            index  index.html index.htm;
        }
    }

    server {
        listen      8080;
        server_name localhost;

        access_log  logs/access.log  custom;   # 使用custom日志格式记录访问日志
        error_log   logs/error.log;   # 记录错误日志

        location / {
            root   /var/www/html;
            index  index.html index.htm;
        }
    }
}

1.2 nginx的运行日志

error_log指令:挺起来像是只记录报错日志,但其实包含了很多日志级别

error_log 日志文件路径 日志级别

日志级别

Nginx的日志级别从低到高包括以下几种:
debug: 这是最低级别的日志,用于调试Nginx。这个级别的日志记录了大量的详细信息,对于调试很有价值,但是在生产环境中通常是禁用的,因为它会产生大量的日志数据。
info: 这个级别的日志记录了一般的运行时事件信息。
notice: 这个级别的日志记录了比较重要的正常运行时事件。
warn: 警告级别的日志表示可能出现的一些问题,虽然这些问题不会立即影响服务器的运行,但是可能需要引起注意。
error: 错误级别的日志记录了导致某个特定操作或请求失败的错误事件,如反向代理一个失败的请求或者连不上FastCGI服务器。
crit: 这是比错误更严重的一类事件,如连接池耗尽、服务器宕掉一个子进程等。
alert: 这个级别的日志记录了需要立即采取行动的问题,如系统磁盘被写满。
emerg: 这是最高级别的日志,这类日志事件表示系统不可用,如非预期的主进程崩溃或者服务器声明“Out of memory”。
在默认情况下,如果不指定日志级别,Nginx会记录error级别及以上的日志。如果指定了日志级别,Nginx会记录指定级别及以上的所有日志。例如,如果设置了warn级别,Nginx会记录warn、error、crit、alert、emerg这几个级别的日志。

说明:error_log的日志格式是固定的,不能自定义

error_log主要用于记录Nginx在运行过程中的错误信息,
这些信息的内容和格式是由Nginx预设并且固定的。
这样的设计可以保证错误信息的一致性和可读性,让用户在检查日志时可以更方便地定位和分析问题

Nginx的错误日志(error_log)的条目通常会包含以下部分信息:

  • 日期和时间:显示了错误信息被记录的日期和时间。例如,"2021/06/17 13:00:00" 显示的是在2021年6月17日的13点整,Nginx记录了一个错误信息。
  • 错误级别:这是一个表示错误严重程度的单词,例如"warn" (警告)、"error" (错误)、"crit" (严重)、"alert" (警报)、"emerg" (紧急).
  • 错误描述:这是一段简短的文本,描述了错误的具体信息。例如,“client intended to send too large body”告诉您客户端试图发送过大的请求主体。
  • 附加信息:一些额外的信息,可能包含导致错误的请求的具体细节,例如客户端IP地址、请求的URL等。

二、日志切割

由lograte工具管理,配置如下

[root@web01 /var/log/nginx]# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log { # 指定要切割的日志

        daily   #每天切割日志
        missingok   #忽略日志丢失
        rotate 52   #日志保留时间 52天
        compress   #日志压缩
        delaycompress  #延时压缩
        not if empty    #不切割空日志
        create 640 nginx adm    #切割好的日志权限
        sharedscripts   #开始执行脚本
        postrotate  #标注脚本内容
                if [ -f /var/run/nginx.pid ]; then#判断nginx启动
                        kill -USR1 `cat /var/run/nginx.pid`   #重新生成一个access.log

                fi
        endscript   #脚本执行完毕
}

说明

在Linux系统中,logrotate工具不运行为一个系统服务,因此你不能使用 systemctl status logrotate 命令查看其状态,
因为它不是一个持续运行的后台服务,而是由cron定时任务调度的一个程序。
logrotate通常是作为一个定时任务来运行的。它的运行通常由系统的cron daemon控制。
默认情况下,logrotate的定时任务通常在/etc/cron.daily/目录下,且文件名为logrotate。
你可以查看这个文件以确认logrotate是否被正确地设置为一个定时任务。

你可以使用以下命令来测试logrotate配置是否正确:
/usr/sbin/logrotate -d /etc/logrotate.conf
加上-d选项,logrotate将运行在调试模式下,显示出它将会进行哪些操作,但是不会真正执行这些操作。
同时,你可以使用下列命令来强制执行一次logrotate:
/usr/sbin/logrotate -f /etc/logrotate.conf
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术