哈嘍大家好,我是咸魚is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
最近我們需要把 Nginx 的日志接入到自研的日志采集平臺上,但是這個平臺只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
例如下面這樣的效果is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
剛開始在主配置文件 nginx.conf 中定義了一個名叫 json 的日志格式字段is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
驗證的時候其他內容沒啥問題,但是時間是2023-09-12T13:54:22+08:00 這樣子的,不太符合預期is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
咸魚想著把 $time_iso8601 變量中的年月日時分秒分別提取出來然后用變量去接受它,如下所示:is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
我自定義了一個時間格式 $year-$month-$day $hour:$minutes:$seconds:000,然后接著用了一個 if 語句用于檢查請求的時間是否匹配 ISO8601 時間格式(例如:2023-09-12T13:54:22+08:00)is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
如果匹配,它將執行其中的代碼塊。在代碼塊中,使用正則表達式提取時間的年、月、日、小時、分鐘和秒,并將它們賦值給變量 $year、$month、$day、$hour、$minutes 和 $secondsis328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
但是 nginx -t 檢測的時候我發現 if 語句不能夠放在 http 塊內,否則會報錯is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
在 Nginx 中,if 語句主要用于在 server 或 location 塊內設置條件,以便根據請求的屬性來執行不同的配置。if 語句通常應該包含在 server 或 location 塊內,而不是直接放在 http 塊中is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
如果將 if 語句放在一個一個 server 塊中,這不得累死我(有很多個 server 塊),而且后期維護也不方便is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
所以如何將自定義變量在全局配置中生效則成為了一個問題is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
map
is328資訊網——每日最新資訊28at.com
map 指令是由 ngx_http_map_module 模塊提供的,是 Nginx 配置文件中的一種用于創建變量映射的指令is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
模塊鏈接:https://nginx.org/en/docs/http/ngx_http_map_module.htmlis328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
它允許我們將一個或多個輸入值映射到一個輸出值,類似于字典或哈希表的概念。map 指令通常用于根據特定條件為請求設置自定義變量,或者執行基于請求屬性的條件控制is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
比較常見的 map 用法是通過 map 來實現允許多個域名跨域訪問的問題is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
語法如下:is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
其中:is328資訊網——每日最新資訊28at.com
- $variable 輸入變量,通常是 nginx 的內置變量。
- $new_variable 輸出變量,它將根據輸入值的映射設置為特定的結果。
- value1, value2, ... 輸入值,可以列出多個值。
- result1, result2, ... 與相應輸入值相關聯的輸出結果。
- default 一個可選項,表示如果沒有匹配的輸入值,將使用默認結果
is328資訊網——每日最新資訊28at.com
需要注意的是,map 只能放在 http 塊中is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
有了 map,我們就可以輕易的把 $time_iso8601 變量中的 ISO 8601 格式的時間戳轉換為指定的時間格式,然后存儲到自定義變量 $log_time 中is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
我們可以看到:is328資訊網——每日最新資訊28at.com
- 輸入變量為 $time_iso8601,輸出變量為 $log_time;
- default "":如果沒有匹配任何條件,將使用空字符串作為 $log_time 的值
- "~^(?<year>/d{4})-(?<month>/d{2})-(?<day>/d{2})T(?<hour>/d{2}):(?<minutes>/d{2}):(?<seconds>/d{2})":這是一個正則表達式條件,它用于匹配 ISO 8601 格式的時間戳。該正則表達式包含了多個捕獲組(使用 ?<name> 語法),用于從時間戳中提取年、月、日、小時、分鐘和秒的值
- "${year}-${month}-${day} ${hour}:${minutes}:${seconds}":這是與正則表達式條件匹配時設置的輸出值。當正則表達式條件匹配時,它會將捕獲組中提取的年、月、日、小時、分鐘和秒的值組合成一個自定義的時間格式,然后將該值設置為 $log_time 變量的值
is328資訊網——每日最新資訊28at.com
例如,如果 $time_iso8601 的值是 "2023-09-09T14:30:00",則 $log_time 將被設置為 "2023-09-09 14:30:00"is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
然后我們再把 $log_time 放進我們自定義的日志格式里面,完整配置如下is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
最后我們驗證一下is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
is328資訊網——每日最新資訊28at.com
本文鏈接:http://www.tebozhan.com/showinfo-26-10492-0.htmlNginx map 實現時間格式轉換
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 反駁來了!放棄TypeScript?說明你無知!
下一篇: 19個JavaScript數組常用方法總結! 趕快收藏吧!