Nginx自定義日志中時(shí)間格式的操作方法
背景
工作需要對(duì)接內(nèi)部的日志中臺(tái),對(duì)日志打印有固定的格式要求,為了使Nginx的access日志也能被采集,需要對(duì)日志格式進(jìn)行自定義,要求日志格式為:
yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG ---> 時(shí)間格式+打印級(jí)別+業(yè)務(wù)日志
如:
23-11-18 17:34:23.738 DEBUG monitor-7 org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug:137: xxxxx
但目前我們Nginx按照默認(rèn)格式配置,大致如下:
192.23.4.5 -- [18/Nov/2023L18:58:52 +0800] "GET /api/cluster HTTP/1.1" 200 155 "https://xxx.xx.xx.x"
時(shí)間格式無(wú)法不符合要求,并且未區(qū)分日志級(jí)別,因此,需要對(duì)日志打印格式進(jìn)行自定義
自定義日志格式配置
1.重新定義日志格式
# 原日志格式 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 '$time_zh_ms $log_level - $remote_addr - $remote_user "$request" $status $body_bytes_sent "http_referer" "$http_user_agent" "$http_x_forwarded_for"; # 對(duì)比修改前后差異,其實(shí)就是 1.自定義了$time_zh_ms,在下面的配置中,將其設(shè)置為yyyy-MM-dd HH:mm:ss.SSS格式 2.自定義了$log_level,為日志打印級(jí)別,下面的配置中,將按照請(qǐng)求響應(yīng)碼來(lái)判斷為何種日志打印級(jí)別 以上只是為了滿足日志采集需要,其他字段可按實(shí)際情況變動(dòng)
2.定義時(shí)間格式的轉(zhuǎn)換
Nginx默認(rèn)支持的時(shí)間格式為iso8601,此處我們需要通過(guò)獲取到內(nèi)置時(shí)間變量$time_iso8601和$msec,具體配置如下:
# 將iso8601格式時(shí)間轉(zhuǎn)換為yyyy-MM-dd HH:mm:ss格式
# 按照正則將時(shí)間字符串分割為6部分,分別為年月日時(shí)分秒,再拼接到$time_zh自定義變量中
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
set $time_zh "$1-$2-$3 $4:$5:$6";
}
# 獲取毫秒時(shí)間戳,并拼接到$time_zh之后
if ($msec ~ "(\d+)\.(\d+)") {
set $time_zh_ms $time_zh.$2
}
# 注意:$time_zh_ms其實(shí)就是在log_format中定義的日志格式第一個(gè)字段3.根據(jù)響應(yīng)碼定義日志級(jí)別
Nginx的access日志默認(rèn)是沒(méi)有日志級(jí)別這一說(shuō)法的,此處可視為我們?yōu)榱诉m配業(yè)務(wù)而做的規(guī)則,在我們的使用場(chǎng)景中,將返回碼為4或5的請(qǐng)求,視為錯(cuò)誤,打印為ERROR級(jí)別,其他請(qǐng)求為INFO級(jí)別
# 如果http返回碼為4或5開(kāi)頭,則設(shè)置log_level為ERROR,否則為INFO
map $status $log_level {
~^[45] ERROR;
default INFO;
}
# 此處$status為Nginx內(nèi)置變量,代表請(qǐng)求的響應(yīng)碼,log_level為自定義變量4.設(shè)置日志使用具體格式并打印到文件
access_log /dev/stdout main; access_log /etc/nginx/logs/access.log main; error_log /dev/stdout; error_log /etc/nginx/logs/error.log;
5.完整配置示例截圖

6.日志打印效果

到此這篇關(guān)于Nginx自定義日志中時(shí)間格式的文章就介紹到這了,更多相關(guān)nginx自定義日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx編譯安裝出現(xiàn)的常見(jiàn)錯(cuò)誤及解決方法
這篇文章給大家介紹了nginx在編譯安裝過(guò)程中容易出現(xiàn)的常見(jiàn)錯(cuò)誤以及解決方法,文中有詳細(xì)的代碼講解,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08
使用Docker主機(jī)啟動(dòng)Nginx服務(wù)器的完整步驟詳解
Docker是一個(gè)開(kāi)源的容器化平臺(tái),用于輕松地打包、部署和運(yùn)行應(yīng)用程序,而Nginx是一個(gè)高性能的開(kāi)源反向代理服務(wù)器,也是一個(gè)流行的Web服務(wù)器,這篇文章主要給大家介紹了關(guān)于使用Docker主機(jī)啟動(dòng)Nginx服務(wù)器的完整步驟,需要的朋友可以參考下2024-07-07
nginx 常用指令 try_files allow root ali
本文主要介紹了nginx 常用指令 try_files allow root alias的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Nginx代理導(dǎo)致請(qǐng)求頭某些內(nèi)容丟失的問(wèn)題解決
本文主要介紹了在使用NGINX代理時(shí)請(qǐng)求頭中的下劃線被自動(dòng)忽略的問(wèn)題,通過(guò)兩種方法解決了這個(gè)問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
nginx+ingress 413問(wèn)題排查過(guò)程
處理413錯(cuò)誤需調(diào)整Nginx的client_max_body_size及Ingress配置,合理設(shè)置body-size,若無(wú)效,檢查后端限制,注意過(guò)大可能影響安全2025-08-08
nginx配置前端請(qǐng)求轉(zhuǎn)發(fā)到指定的后端ip方式
文章主要解釋了Nginx配置中如何通過(guò)location規(guī)則將前端靜態(tài)資源和后端接口請(qǐng)求進(jìn)行分流,并詳細(xì)描述了請(qǐng)求轉(zhuǎn)發(fā)到后端的具體過(guò)程,包括rewrite規(guī)則、代理協(xié)議設(shè)置、請(qǐng)求頭透?jìng)?、代理地址指定及失敗重試機(jī)制等2026-05-05
nginx 平滑重啟與升級(jí)的實(shí)現(xiàn)方法
有時(shí)候我們需要平滑重啟nginx服務(wù),防止出現(xiàn)問(wèn)題,這里簡(jiǎn)單的總結(jié),方便需要的朋友2013-02-02
Nginx如何獲取自定義請(qǐng)求header頭和URL參數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Nginx如何獲取自定義請(qǐng)求header頭和URL參數(shù)的相關(guān)資料,本文適用于需要在nginx里獲取http請(qǐng)求頭信息或者傳遞的參數(shù)進(jìn)行一些計(jì)算和處理的情況,需要的朋友可以參考下2022-07-07

