一、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;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236025.html