您的位置:

深入了解nginx日志级别

一、nginx日志级别介绍

nginx作为一款高效、稳定、灵活的Web服务器和反向代理服务器,在应用和运维中广泛使用。在nginx的运维中,日志文件是非常重要的组成部分,它能够记录nginx的基本信息、请求信息、错误信息等。nginx的日志级别主要有以下几种:

  • alert - 系统级别紧急信息
  • critical - 关键错误信息
  • error - 一般性错误信息
  • warn - 警告信息
  • notice - 一些特殊信息
  • info - 一般信息
  • debug - 调试信息

二、日志级别的设置

nginx的日志级别可以在nginx.conf配置文件中设置:

  error_log /var/log/nginx/error.log warn;

此处我们设置为warn级别,意味着只有警告信息和以上级别的信息会记录在日志文件中。如果要记录更详细的信息,可以将级别设置为debug。

三、日志文件的分类

按照日志文件类型和记录格式,我们可以将日志文件分成两类:访问日志和错误日志。

1. 访问日志

访问日志用来记录每个请求的基本信息,以下是一些典型的访问日志格式:

  • combined - 以Apache的combined日志格式为模板
  • main - 简单的nginx默认格式
  • json - 以JSON格式记录
  • grpc - 以gRPC格式记录

以下是以combined格式为例的访问日志配置,该格式可以同时记录请求信息和响应码:

  access_log /var/log/nginx/access.log combined;

2. 错误日志

错误日志用来记录任何nginx处理请求时发生的错误信息。

以下是一个用于记录所有错误级别的基本配置:

  error_log /var/log/nginx/error.log;

此处未设置级别,表示记录所有调试信息、消息、警告和错误信息。

四、注意事项

1. 周期性日志文件切割

由于nginx的日志文件很容易变得非常大,而且记录时间跨度较长,因此需要对日志文件进行切割。切割日志文件的方式有很多,可以使用logrotate、crontab等工具进行周期性的日志文件切割。具体操作如下:

  sudo vim /etc/crontab

添加一行在每天凌晨1点钟执行切割任务的计划:

  0 1 * * * root /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

2. 日志防护措施

nginx日志记录了一些敏感信息,如请求地址、参数、cookie等等,泄露这些信息会对系统造成安全威胁。因此需要采取措施保护这些日志文件。常见的保护措施有:

  • 文件权限设置
  • 加密存储
  • 开启访问日志压缩

以下是设置压缩访问日志的配置:

  gzip on;
  gzip_comp_level 2;
  gzip_min_length 1024;
  gzip_types text/plain text/css text/javascript application/json application/javascript application/xml;
  gzip_disable “MSIE [1-6]\.”;

3. 日志分析工具

nginx的日志文件内容很难直接阅读,需要使用日志分析工具将其可视化。目前市面上比较常用的日志分析工具有ELK、Fluentd、Logstash、Splunk等等。以下是使用ELK进行nginx日志分析的简单配置:

  access_log /var/log/nginx/access.log combined_json;
  # Additional logs for ELK
  log_format json escaped_json '{ "@timestamp": "$time_iso8601", '
                                '"host": "$server_addr", '
                                '"client_ip": "$remote_addr", '
                                '"size": $body_bytes_sent, '
                                '"response_time": $request_time, '
                                '"upstream_response_time": $upstream_response_time, '
                                '"upstream_connect_time": $upstream_connect_time, '
                                '"upstream_status": $upstream_status, '
                                '"request_method": "$request_method", '
                                '"url": "$uri", '
                                '"request": "$request", '
                                '"http_referrer": "$http_referer", '
                                '"http_x_forwarded_for": "$http_x_forwarded_for", '
                                '"http_user_agent": "$http_user_agent" }';
  error_log /var/log/nginx/error.log debug;

  # ELK Integration
  if ($request_uri = /healthz) { return 200; }
  location /nginx_logs {
    access_log off;

    tcp_nodelay on;
    proxy_http_version      1.1;
    proxy_connect_timeout   10s;
    proxy_request_buffering off;
    proxy_buffering         off;
    proxy_pass              http://localhost:5000/;

    # Send JSON logs
    log_format escaped_json '{ "@timestamp": "$time_iso8601", '
                                '"host": "$server_addr", '
                                '"client_ip": "$remote_addr", '
                                '"size": $body_bytes_sent, '
                                '"response_time": $request_time, '
                                '"upstream_response_time": $upstream_response_time, '
                                '"upstream_connect_time": $upstream_connect_time, '
                                '"upstream_status": $upstream_status, '
                                '"request_method": "$request_method", '
                                '"url": "$uri", '
                                '"request": "$request", '
                                '"http_referrer": "$http_referer", '
                                '"http_x_forwarded_for": "$http_x_forwarded_for", '
                                '"http_user_agent": "$http_user_agent" }';
   access_log syslog:server=logs.mysite.com:60223,facility=local7,tag=mynamespace,severity=informational escaped_json;
  }