Nginx日誌配置

文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。
filenginx

衆所周知,線上若是出現事故咱們一般都是查看日誌去進行問題定位而且進行修復。使用好Nginx日誌有利於咱們線上進行修復異常問題。在Nginx中日誌主要分爲兩種:access_log(訪問日誌)和error_log(錯誤日誌)。經過查看access_log咱們能夠查看用戶ip,瀏覽器信息及請求時間等信息,經過查看error_log咱們能夠查看線上出錯的具體信息,能夠幫助咱們定位異常的緣由。本篇文章主要帶領你們詳細瞭解Nginx如何配置日誌。本文將會涉及到的日誌配置指令:json

  • access_log
  • log_format
  • open_log_file_cache
  • log_not_found
  • log_subrequest
  • rewrite_log
  • error_log

access_log指令segmentfault

首先,咱們能夠先看看access_log指令。access_log命令能夠配置訪問日誌。咱們能夠先看下access_log指令的語法結構:瀏覽器

  • access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設置訪問日誌
  • access_log off; # 關閉訪問日誌

咱們先來看看語法結構中的參數的含義:緩存

  • path: 指定日誌的存放位置
  • format: 指定日誌的格式,非必填,默認爲預約義的combined
  • buffer:指定日誌寫入時的緩存大小,非必填,默認64k
  • gzip: 日誌寫入前先進行壓縮
  • flush: 設置緩存的有效期
  • if: 設置條件判斷,當天劍成立時纔會寫入日誌
  • off: 值爲off表示不開啓日誌,值爲on表示開啓日誌

access_log指令能夠使用於http根節點,虛擬服務器server節點,上下文配置location以及limit_except中。沒法在其餘做用域使用access_log指令,不然Nginx會報錯。咱們能夠看一個簡單的配置access_log的小例子:服務器

  • access_log /root/.pm2/logs/niyueling.log buffer=32k gzip flush=5m

這個配置指定日誌存儲路徑爲/root/.pm2/logs/niyueling.log,日誌使用默認格式combined。日誌緩存大小爲32k,日誌寫入前會進行gzip壓縮,緩存有效期爲5分鐘。微信

log_format指令性能

剛纔有講過若是未指定日誌格式,Nginx會使用combined日誌格式爲默認格式。combined日誌格式默認使用格式爲:網站

  • log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

可是若是不想使用combined日誌格式,就能夠使用log_format指令來自定義格式內容。log_format指令須要在http節點下進行配置。咱們先來看下log_format指令的語法結構:編碼

  • log_format name [escape=default|json] string;

咱們先來看看log_format的參數對應的用法:

  • name: 指定日誌格式名稱,由於在access_log指令中須要指定日誌格式
  • escape: 設置字符編碼方式,能夠選擇default或者json
  • string: 要寫入日誌的內容,能夠有多個參數,能夠使用Nginx變量。

下面貼一下log_format指令中經常使用的一些變量:
file

咱們能夠接着看個自定義日誌格式的小案例

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$gzip_ratio" $request_time $bytes_sent $request_length';

server {
server_name www.niyueling.cn;
access_log /root/.pm2/logs/niyueling.log main;
}
}

open_log_file_cache指令

對於網站的訪問記錄,一般操做都是首先打開日誌文件,而後寫入日誌記錄,最後關閉文件。默認狀況下日誌文件不進行緩存的,咱們能夠經過open_log_file_cache指令設置日誌文件緩存。open_log_file_cache指令能夠配置在http根節點,虛擬服務器server節點以及上下文location中。咱們先看下open_log_file_cache指令的語法結構:

  • open_log_file_cache max=X [inactive=time] [min_uses=N] [valid=time];
  • open_log_file_cache off;

首先先貼下參數對應的含義:

  • max: 設置緩存中的最大文件描述符
  • inactive: 設置存活時間
  • min_uses: 在存活時間內,日誌文件最少被使用幾回後將日誌文件描述符寫入緩存。
  • valid: 設置檢查頻率
  • off: 禁用日誌緩存

能夠看一個簡單配置日誌緩存的小例子:

  • open_log_file_cache max=100 inactive=30s valid=5m min_uses=3;

log_not_found指令

這個命令用於指定是否在error_log錯誤日誌中記錄不存在的錯誤,如文件不存在等。默認值爲是。咱們能夠先看下語法結構:

  • log_not_found on | off;

log_not_found指令能夠配置在http根節點,虛擬服務器server節點以及上下文location中。設置爲on表示記錄不存在的錯誤,設置爲off表示不記錄不存在的錯誤。

log_subrequest指令

log_subrequest指令用於指定在access_log訪問日誌中是否記錄子請求的訪問記錄。默認狀況爲不記錄,貼下語法結構:

  • log_subrequest on | off;

log_subrequest指令能夠配置在http根節點,虛擬服務器server節點以及上下文location中。設置爲on表示記錄子請求訪問記錄,設置爲off表示不記錄子請求訪問記錄。

rewrite_log指令

rewrite_log指令由ngx_http_rewrite_module模塊提供服務,用來記錄日誌重寫。能夠在error_log錯誤日誌中記錄notice級別的重寫日誌。默認是不啓用狀態,貼下語法結構:

  • rewrite_log on | off;

rewrite_log指令能夠配置在http根節點,虛擬服務器server節點以及上下文location以及if條件判斷中。設置爲on表示在錯誤日誌中記錄notice級別的重寫日誌,設置爲off表示在錯誤日誌中不記錄notice級別的重寫日誌。

error_log指令

error_log指令顧名思義,就是用來指定錯誤日誌的,通常來講線上出現bug都是經過error_log日誌來定位問題所在而加以解決的。error_log指令能夠記錄服務器和請求處理過程當中的錯誤信息。咱們先看下error_log指令的語法結構:

  • error_log file [level];

參數含義其實很容易能夠理解:

  • file: error_log 存放路徑
  • level: 日誌級別,只有日誌級別高於指定級別纔會記錄到error_log中
  • error_log指令能夠配置在http節點,main節點,虛擬服務器server節點以及上下文location中。

日誌切割

Nginx記錄日誌默認狀況下是訪問日誌所有寫入access_log中,錯誤日誌所有寫入error_log中。這樣會致使日誌文件原來越大,不利於查看日誌分析問題異常,因此咱們能夠將日誌以日期爲單位進行切割。首先須要寫一個腳本實現Nginx按天切割:

日誌保存位置
  • base_path='/root/.pm2/logs/niyueling.log'
獲取當前年信息和月信息
  • log_path=$(date -d yesterday +"%Y%m")
獲取昨天的日信息
  • day=$(date -d yesterday +"%d")
按年月建立文件夾
  • mkdir -p $base_path/$log_path
備份昨天的日誌到當月的文件夾
  • mv $base_path/access.log $base_path/$log_path/access_$day.log
輸出備份日誌文件名
  • echo $base_path/$log_path/access_$day.log
經過Nginx信號量控制重讀日誌
  • kill -USR1 cat /opt/nginx/logs/nginx.pid

而後給腳本添加可執行權限,最後添加Linux定時任務:

  • crontab -e

天天凌晨兩點半進行日誌分割

  • 30 02 0 * /root/.pm2/logs/splitLog.sh

重啓Linux定時任務

  • crond restart

經過上面的講解差很少能夠知道Nginx對於日誌是如何進行配置的,實際上就是經過log_format配置日誌格式,若是log_format中使用了Nginx變量,則能夠經過open_log_file_cache指令來設置緩存提升性能。而後經過access_log進行設置訪問日誌,經過error_log指令設置錯誤日誌。最後實現定時任務定時切割天天的日誌,有利於咱們後期維護。

若是喜歡個人文章,歡迎關注我的公衆號:程序猿周先森。
file

相關文章
相關標籤/搜索