nginx日志介紹
nginx 有一個(gè)非常靈活的日志記錄模式,每個(gè)級(jí)別的配置可以有各自獨(dú)立的訪問(wèn)日志, 所需日志模塊 ngx_http_log_module的支持,日志格式通過(guò) log_format 命令來(lái)定義,日志對(duì)于統(tǒng)計(jì)和排錯(cuò)是非常有利的,下 面總結(jié)了 nginx 日志相關(guān)的配置 包括 access_log 、 log_format 、 open_log_file_cache 、 rewrite_log 、 error_log。
# 設(shè)置訪問(wèn)日志
access_log path [format [buffer=size] [gzip[=level]] [flush=time][if=condition]];
# 關(guān)閉訪問(wèn)日志
access_log off;
1.path 指定日志的存放位置。
2.format 指定日志的格式。默認(rèn)使用預(yù)定義的 combined 。
3.bu?er 用來(lái)指定日志寫入時(shí)的緩存大小。默認(rèn)是64k。
4.gzip 日志寫入前先進(jìn)行壓縮。壓縮率可以指定,從1到9數(shù)值越大壓縮比越高,同時(shí)壓縮的速度也越慢。默認(rèn) 是1。
5.?ush 設(shè)置緩存的有效時(shí)間。如果超過(guò)?ush指定的時(shí)間,緩存中的內(nèi)容將被清空。
6.if 條件判斷。如果指定的條件計(jì)算為0或空字符串,那么該請(qǐng)求不會(huì)寫入日志。
作用域:
可以應(yīng)用 access_log 指令的作用域分別有http , server , location , limit_except 。也就是說(shuō),在這幾個(gè) 作用域外使用該指令,Nginx會(huì)報(bào)錯(cuò)。
access_log /var/logs/nginx-access.log
該例子指定日志的寫入路徑為 /var/logs/nginx-access.log ,日志格式使用默認(rèn)的 combined
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
該例子指定日志的寫入路徑為/var/logs/nginx-access.log,日志格式使用默認(rèn)的 combined ,指定日志的緩存大 小為 32k,日志寫入前啟用 gzip 進(jìn)行壓縮,壓縮比使用默認(rèn)值 1,緩存數(shù)據(jù)有效時(shí)間為1分鐘。
log_format 指令
Nginx 預(yù)定義了名為 combined 日志格式,如果沒(méi)有明確指定日志格式默認(rèn)使用該格式:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
如果不想使用Nginx預(yù)定義的格式,可以通過(guò) log_format指令來(lái)自定義。
語(yǔ)法
log_format name [escape=default|json] string ...;
1.name 格式名稱。在 access_log 指令中引用。
2.escape 設(shè)置變量中的字符編碼方式是 json 還是 default ,默認(rèn)是 default 。
3.string 要定義的日志格式內(nèi)容。該參數(shù)可以有多個(gè)。參數(shù)中可以使用Nginx變量。
log_format 指令中常用的一些變量:

自定義日志格式的使用:
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 指令定義了一個(gè) main 的格式,并在 access_log 指令中引用了它。假如客戶端有發(fā)起請(qǐng)求,我們看一下我截取的一個(gè)請(qǐng)求的日志記錄:
10.0.105.207 - - [01/Jul/2019:10:44:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"
我們看到終的日志記錄中 $remote_user 、 $http_referer 、 $http_x_forwarded_for都對(duì)應(yīng)了一個(gè) - ,這是因 為這幾個(gè)變量為空。
error_log 指令
錯(cuò)誤日志在Nginx中是通過(guò) error_log 指令實(shí)現(xiàn)的。該指令記錄服務(wù)器和請(qǐng)求處理過(guò)程中的錯(cuò)誤信息。
語(yǔ)法
配置錯(cuò)誤日志文件的路徑和日志級(jí)別。
error_log file [level];
Default:
error_log logs/error.log error;
file 參數(shù)指定日志的寫入位置。
level 參數(shù)指定日志的級(jí)別。level可以是debug , info , notice , warn , error , crit , alert , emerg中的任 意值??梢钥吹狡淙≈捣秶前淳o急程度從低到高排列的。只有日志的錯(cuò)誤級(jí)別等于或高于level指定的值才會(huì)寫入 錯(cuò)誤日志中。默認(rèn)值是 error 。
基本用法
error_log /var/logs/nginx/nginx-error.log
配置段:main , http , mail , stream , server , location作用域。 例子中指定了錯(cuò)誤日志的路徑為:/var/logs/nginx/nginx-error.log,日志級(jí)別使用默認(rèn)的 error 。
open_log_?le_cache 指令
每一條日志記錄的寫入都是先打開文件再寫入記錄,然后關(guān)閉日志文件。如果你的日志文件路徑中使用了變量,如 access_log /var/logs/$host/nginx-access.log,為提高性能,可以使用 open_log_file_cache 指令設(shè)置日志文 件描述符的緩存。
語(yǔ)法
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
默認(rèn)值:
open_log_file_cache off;
max 設(shè)置緩存中多容納的文件描述符數(shù)量,如果被占滿,采用LRU算法將描述符關(guān)閉。
inactive 設(shè)置緩存存活時(shí)間,默認(rèn)是10s。
min_uses 在inactive時(shí)間段內(nèi),日志文件少使用幾次,該日志文件描述符記入緩存,默認(rèn)是1次。
valid:設(shè)置多久對(duì)日志文件名進(jìn)行檢查,看是否發(fā)生變化,默認(rèn)是60s。
o?:不使用緩存。默認(rèn)為o?。
基本用法
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
配置段: http 、 server 、 location作用域中。
例子中,設(shè)置緩存多緩存1000個(gè)日志文件描述符,20s內(nèi)如果緩存中的日志文件描述符至少被被訪問(wèn)2次, 才不會(huì)被緩存關(guān)閉。每隔1分鐘檢查緩存中的文件描述符的文件名是否還存在。
rewrite_log 指令
由 ngx_http_rewrite_module 模塊提供的。用來(lái)記錄重寫日志的。對(duì)于調(diào)試重寫規(guī)則建議開啟,啟用時(shí)將在 error log 中記錄 notice 級(jí)別的重寫日志。 基本語(yǔ)法:
rewrite_log on | off;
默認(rèn)值:
rewrite_log off;
nginx 日志配置總結(jié)
Nginx中通過(guò)access_log 和 error_log指令配置訪問(wèn)日志和錯(cuò)誤日志,通過(guò) log_format我們可以自定義日 志格式。如果日志文件路徑中使用了變量,我們可以通過(guò) open_log_file_cache指令來(lái)設(shè)置緩存,提升性 能。其他的根據(jù)自己的使用場(chǎng)景定義。
詳細(xì)的日志配置信息可以參考Nginx官方文檔
nginx的日志輪轉(zhuǎn)
[root@192 ~]# rpm -ql nginx |grep log
/etc/logrotate.d/nginx
/var/log/nginx
[root@192 ~]# vim /etc/logrotate.d/nginx
/var/log/nginx/*.log { #指定需要輪轉(zhuǎn)處理的日志文件
daily #日志文件輪轉(zhuǎn)周期,可用值為: daily/weekly/yearly
missingok # 忽略錯(cuò)誤信息
rotate 7 # 輪轉(zhuǎn)次數(shù),即多存儲(chǔ)7個(gè)歸檔日志,會(huì)刪除久的歸檔日志
minsize 5M #限制條件,大于5M的日志文件才進(jìn)行分割,否則不操作
dateext # 以當(dāng)前日期作為命名格式
compress # 輪循結(jié)束后,已歸檔日志使用gzip進(jìn)行壓縮
delaycompress # 與compress共用,近的一次歸檔不要壓縮
notifempty # 日志文件為空,輪循不會(huì)繼續(xù)執(zhí)行
create 640 nginx nginx #新日志文件的權(quán)限
sharedscripts #有多個(gè)日志需要輪詢時(shí),只執(zhí)行一次腳本
postrotate # 將日志文件轉(zhuǎn)儲(chǔ)后執(zhí)行的命令。以endscript結(jié)尾,命令需要單獨(dú)成行
if [ -f /var/run/nginx.pid ]; then #判斷nginx的PID。# 默認(rèn)logrotate會(huì)以 root身份運(yùn)行
kill -USR1 cat /var/run/nginx.pid
fi
endscript
}
執(zhí)行命令:
[root@192 nginx]# /usr/sbin/logrotate -f /etc/logrotate.conf
創(chuàng)建計(jì)劃任務(wù):
[root@192 nginx]# crontab -e 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.conf