一、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;
}