1. 程式人生 > >nginx日誌詳解

nginx日誌詳解

速度 發送 date limit 設置 記錄 IV ron 提升

nginx日誌詳解

一、nginx日誌介紹

Nginx日誌對於統計、系統服務排錯很有用。Nginx日誌主要分為兩種:access_log(訪問日誌)error_log(錯誤日誌)。通過訪問日誌我們可以得到用戶的IP地址、瀏覽器的信息,請求的處理時間等信息。錯誤日誌記錄了訪問出錯的信息,可以幫助我們定位錯誤的原因。本文將詳細描述一下如何配置Nginx日誌。

訪問日誌主要記錄客戶端的請求。客戶端向Nginx服務器發起的每一次請求都記錄在這裏。客戶端IP,瀏覽器信息,referer,請求處理時間,請求URL等都可以在訪問日誌中得到。當然具體要記錄哪些信息,你可以通過log_format指令定義。

錯誤日誌在

Nginx中是通過error_log指令實現的。該指令記錄服務器和請求處理過程中的錯誤信息。

Nginx中通過access_logerror_log指令配置訪問日誌和錯誤日誌,通過log_format我們可以自定義日誌格式。如果日誌文件路徑中使用了變量,我們可以通過open_log_file_cache指令來設置緩存,提升性能。

另外,在access_loglog_format中使用了很多變量,詳細的變量信息可以參考Nginx官方文檔

二、訪問日誌配置

1、設置訪問日誌的語法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

# 設置訪問日誌

access_log off; # 關閉訪問日誌

path 指定日誌的存放位置。

format 指定日誌的格式。默認使用預定義的combined

buffer 用來指定日誌寫入時的緩存大小。默認是64k

gzip 日誌寫入前先進行壓縮。壓縮率可以指定,從19數值越大壓縮比越高,同時壓縮的速度也越慢。默認是1

flush 設置緩存的有效時間。如果超過flush指定的時間,緩存中的內容將被清空。

if 條件判斷。如果指定的條件計算為0或空字符串,那麽該請求不會寫入日誌。

2、訪問日誌的作用域

可以應用access_log指令的作用域分別有httpserverlocationlimit_except。也就是說,在這幾個作用域外使用該指令,

Nginx會報錯。

3、訪問日誌使用實例

access_log /var/logs/nginx-access.log

該例子指定日誌的寫入路徑為/var/logs/nginx-access.log,日誌格式使用默認的combined

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

該例子指定日誌的寫入路徑為/var/logs/nginx-access.log,日誌格式使用默認的combined,指定日誌的緩存大小為32k,日誌寫入前啟用gzip進行壓縮,壓縮比使用默認值1,緩存數據有效時間為1分鐘。

三、使用log_format自定義日誌格式

1nginx默認日誌格式

Nginx預定義了名為combined日誌格式,如果沒有明確指定日誌格式默認使用該格式:

log_format combined '$remote_addr - $remote_user [$time_local] '

'"$request" $status $body_bytes_sent '

'"$http_referer" "$http_user_agent"';

如果不想使用Nginx預定義的格式,可以通過log_format指令來自定義。

2Nginx自定義日誌語法及常用變量

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

name 格式名稱。在access_log指令中引用。

escape 設置變量中的字符編碼方式是json還是default,默認是default

string 要定義的日誌格式內容。該參數可以有多個。參數中可以使用Nginx變量。

下面是log_format指令中常用的一些變量:

變量

含義

$bytes_sent

發送給客戶端的總字節數

$body_bytes_sent

發送給客戶端的字節數,不包括響應頭的大小

$connection

連接序列號

$connection_requests

當前通過連接發出的請求數量

$msec

日誌寫入時間,單位為秒,精度是毫秒

$pipe

如果請求是通過http流水線發送,則其值為"p",否則為“."

$request_length

請求長度(包括請求行,請求頭和請求體)

$request_time

請求處理時長,單位為秒,精度為毫秒,從讀入客戶端的第一個字節開始,直到把最後一個字符發送張客戶端進行日誌寫入為止

$status

響應狀態碼

$time_iso8601

標準格式的本地時間,形如“2017-05-24T18:31:27+08:00

$time_local

通用日誌格式下的本地時間,如"24/May/2017:18:31:27 +0800"

$http_referer

請求的referer地址。

$http_user_agent

客戶端瀏覽器信息。

$remote_addr

客戶端IP

$http_x_forwarded_for

當前端有代理服務器時,設置web節點記錄客戶端地址的配置,此參數生效的前提是代理服務器也要進行相關的x_forwarded_for設置。

$request

完整的原始請求行,如 "GET / HTTP/1.1"

$remote_user

客戶端用戶名稱,針對啟用了用戶認證的請求

$request_uri

完整的請求地址,如 "https://daojia.com/"

3、自定義日誌格式的使用

access_log /var/logs/nginx-access.log main

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指令定義了一個main的格式,並在access_log指令中引用了它。假如客戶端有發起請求:https://suyunfe.com/,我們看一下我截取的一個請求的日誌記錄:

112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"

我們看到最終的日誌記錄中$remote_user$http_referer$http_x_forwarded_for都對應了一個”-“,這是因為這幾個變量為空。

四、錯誤日誌配置error_log

1、設置錯誤日誌的語法

錯誤日誌主要記錄客戶端訪問Nginx出錯時的日誌,格式不支持自定義。通過錯誤日誌,你可以得到系統某個服務或server的性能瓶頸等。因此,將日誌好好利用,你可以得到很多有價值的信息。錯誤日誌由指令error_log來指定,具體格式如下:

error_log path(存放路徑) level(日誌等級)

path含義同access_loglevel表示日誌等級,日誌等級分為[ debug | info | notice | warn | error | crit ],從左至右,日誌詳細程度逐級遞減,即debug最詳細,crit最少。

舉例說明如下:

error_log logs/error.log info;

需要註意的是:error_log off並不能關閉錯誤日誌,而是會將錯誤日誌記錄到一個文件名為off的文件中。正確的關閉錯誤日誌記錄功能的方法如下:

error_log /dev/null; 表示將存儲日誌的路徑設置為“垃圾桶”。

第一個參數指定日誌的寫入位置。

第二個參數指定日誌的級別。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值範圍是按緊急程度從低到高排列的。只有日誌的錯誤級別等於或高於level指定的值才會寫入錯誤日誌中。默認值是error

2nginx日誌設置的基本用法

error_log /var/logs/nginx/nginx-error.log

它可以配置在:main http, mail, stream, server, location作用域。

例子中指定了錯誤日誌的路徑為:/var/logs/nginx/nginx-error.log,日誌級別使用默認的error

open_log_file_cache

每一條日誌記錄的寫入都是先打開文件再寫入記錄,然後關閉日誌文件。如果你的日誌文件路徑中使用了變量,如access_log /var/logs/$host/nginx-access.log,為提高性能,可以使用open_log_file_cache指令設置日誌文件描述符的緩存。

語法

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

max 設置緩存中最多容納的文件描述符數量,如果被占滿,采用LRU算法將描述符關閉。

inactive 設置緩存存活時間,默認是10s

min_uses inactive時間段內,日誌文件最少使用幾次,該日誌文件描述符記入緩存,默認是1次。

valid:設置多久對日誌文件名進行檢查,看是否發生變化,默認是60s

off:不使用緩存。默認為off

基本用法

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

它可以配置在httpserverlocation作用域中。

例子中,設置緩存最多緩存1000個日誌文件描述符,20s內如果緩存中的日誌文件描述符至少被被訪問2次,才不會被緩存關閉。每隔1分鐘檢查緩存中的文件描述符的文件名是否還存在。

五、Nginx日誌分割

1、編寫nginx日誌分割腳本

[root@localhost ~]# vim /usr/local/nginx/logs/NginxLogRotate.sh

#!/bin/bash

LOGS_PATH=/usr/local/nginx/logs

YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

cp ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log && >${LOGS_PATH}/access.log

cp ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log && >${LOGS_PATH}/error.log

2、設置定時任務運行腳本

[root@localhost ~]# crontab -e

0 0 * * * /usr/local/nginx/logs/NginxLogRotate.sh

定時任務每天00:00執行腳本/usr/local/nginx/logs/NginxLogRotate.sh,實現定時自動分割Nginx日誌(包括訪問日誌和錯誤日誌),這樣Nginx每天都會生成一個新的日誌文件。


nginx日誌詳解