Nginx 記錄日誌的幾種方法

2022-07-08 20:00:12 字數 2402 閱讀 1584

nginx的日誌記錄主機設定

server

}預設情況下,access_log 會使用 combined 的配置來記錄訪問日誌

通常這樣就足夠了。

如果是為了更加方便的日誌分析,通常我們會使用特殊字元(如 ^a) 來作為日誌欄位的分隔符,

這樣無論是過濾還是排序都會十分方便。甚至可以直接匯入 mysql/hive 中,使用強大的 sql 來做查詢分析。

為了排版方便,所有特殊字元都使用了展開的寫法,請自行替換 ^a 為 ctrl+v,ctrl+a (nginx 日誌格式不支援 \1 的寫法)。

自定義日誌格式:

server

log_format abc 「$typ^a$uri」;

如果使用 nginx 比較多,可能會嘗試使用 if ,建議不要使用,因為nginx的if比較讓人混亂。

如果有更多複雜的字段處理需求,可以使用 ngx_lua (

ngx_lua 裡面操作 nginx 變數

# 實現上面 map 類似的功能

# 用法詳見 

# lua 語法見 

set_by_lua $typ 」

local uri = ngx.var.uri

local _m = string.match

local v = 『-』

if _m(uri, 『^/login』) then

v = 『user』

elseif _m(uri, 『^/my』) then

v = 『user』

elseif _m(uri, 『^/static』) then

v = 『static』

endreturn v

「;某些情況下,可能我們的字段處理需要查詢快取(如redis)、資料庫(如mysql)等,

這些都是可以使用 ngx_openresty 高效完成的(

這些功能就不在這一篇詳細描述了,後續篇章會補充這些功能。

再描述一些複雜的日誌記錄功能吧。

有時候我們希望根據請求,來判斷是否需要記錄這一條日誌。

在web的訪問日誌中這種需求比較少,但是獨立的日誌收集伺服器一般有這樣的需求的。

比如我需要判定,請求引數 arg_id 必須存在且為數字的時候我才記錄日誌,可以這樣實現

server

location = /i-log

location = /1.gif

}利用這個特性,我們甚至可以合併多個記錄為1個http請求,在 ngx_lua 內再將多條記錄拆分記錄到日誌檔案

比如上例,我門可以新增乙個字段 n 來標識有幾條記錄,並且給 q 之類的引數編號 q_1 .. q_n 。

# get /1.gif?n=2&q_1=a&q_2=b&ie=gbk&oe=utf8&ref=

# 其他**不變,只修改 1.gif 的 access_by_lua 為以下**

local n = ngx.var.arg_n

if n then

n = tonumber(n)

if n > 0 then

local logs = {}

local prefix = string.format(『/i-log?ie=%s&oe=%s&ref=%s&q=』, ngx.var.arg_ie, ngx.var.arg_oe, ngx.var.arg_ref)

while n >= 1 do

– 這裡可以對 q_n 做進一步的校驗,看是否需要記錄下來

table.insert(logs, )

n = n – 1

end– 見 

ngx.location.capture_multi(logs)

endend

如果請求量較大,一把需要新增寫buffer,

方式為在每條 access_log 後面新增 buffer=32k 這樣的設定(見

快取的大小可以設定成 可以忍受丟失的記錄數*每條記錄的size

至此,各種記錄功能都完成啦。

日誌服務其他必要的功能,就是日誌輪轉了。

nginx 日誌輪轉的原理是

# 啟動nginx收日誌

# 啟用cron任務

## 將日誌檔案move走 (檔名可以帶上時間戳)

## 給 nginx master 程序傳送 usr1 訊號(nginx就會重新開啟新的日誌檔案)

### 否則,日誌會仍然記錄到之前的日誌檔案中,雖然被 move 了

## cron 的頻度可以根據日誌大小調整,盡可能大些,能以天為單位就不要以半天為單位

php中記錄日誌的幾種方法

1 使用fwrite 函式寫入檔案 now date y m d time filename log tongbu now.log file fopen filename,a a 表示檔案可讀寫方式開啟 fwrite file,開始寫入 n time time res www.geiliyou.co...

linux檢視日誌的幾種方法

tail n 是顯示行號 相當於nl命令 例子如下 tail 100f test.log 實時監控100行日誌 tail n 10 test.log 查詢日誌尾部最後10行的日誌 tail n 10 test.log 查詢10行之後的所有日誌 head 跟tail是相反的,tail是看後多少行日誌,...

對於大日誌分割的幾種方法

ls lrth test.log rw r r 1 root root 645m 5月 30 20 42 test.log wc l test.log 8856340 test.log含義 b分割後的文件大小,單位是byte c分割後的文件,單行最大byte數 d使用數字作為字尾,同時使用 a le...