Nginx自定義日誌中時間格式

来源:https://www.cnblogs.com/ailiner/archive/2023/11/18/17840820.html
-Advertisement-
Play Games

背景 工作需要對接內部的日誌中台,對日誌列印有固定的格式要求,為了使Nginx的access日誌也能被採集,需要對日誌格式進行自定義,要求日誌格式為: yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG > 時間格式+列印級別+業務日誌 如: 23-11-18 17: ...


背景

工作需要對接內部的日誌中台,對日誌列印有固定的格式要求,為了使Nginx的access日誌也能被採集,需要對日誌格式進行自定義,要求日誌格式為:

yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG ---> 時間格式+列印級別+業務日誌

如:

23-11-18 17:34:23.738 DEBUG monitor-7 org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug:137: xxxxx

但目前我們Nginx按照預設格式配置,大致如下:

192.23.4.5 -- [18/Nov/2023L18:58:52 +0800] "GET /api/cluster HTTP/1.1" 200 155 "https://xxx.xx.xx.x"

時間格式無法不符合要求,並且未區分日誌級別,因此,需要對日誌列印格式進行自定義

自定義日誌格式配置

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";

# 對比修改前後差異,其實就是
1.自定義了$time_zh_ms,在下麵的配置中,將其設置為yyyy-MM-dd HH:mm:ss.SSS格式
2.自定義了$log_level,為日誌列印級別,下麵的配置中,將按照請求響應碼來判斷為何種日誌列印級別

以上只是為了滿足日誌採集需要,其他欄位可按實際情況變動

2.定義時間格式的轉換

Nginx預設支持的時間格式為iso8601,此處我們需要通過獲取到內置時間變數$time_iso8601$msec,具體配置如下:

點擊查看代碼
# 將iso8601格式時間轉換為yyyy-MM-dd HH:mm:ss格式
# 按照正則將時間字元串分割為6部分,分別為年月日時分秒,再拼接到$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";
}

# 獲取毫秒時間戳,並拼接到$time_zh之後
if ($msec ~ "(\d+)\.(\d+)") {
  set $time_zh_ms $time_zh.$2
}

# 註意:$time_zh_ms其實就是在log_format中定義的日誌格式第一個欄位

3.根據響應碼定義日誌級別

Nginx的access日誌預設是沒有日誌級別這一說法的,此處可視為我們為了適配業務而做的規則,在我們的使用場景中,將返回碼為4或5的請求,視為錯誤,列印為ERROR級別,其他請求為INFO級別

點擊查看代碼
# 如果http返回碼為4或5開頭,則設置log_level為ERROR,否則為INFO
map $status $log_level {
  ~^[45] ERROR;
  default INFO;
}

# 此處$status為Nginx內置變數,代表請求的響應碼,log_level為自定義變數

4.設置日誌使用具體格式並列印到文件

點擊查看代碼
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.完整配置示例截圖

image

6.日誌列印效果

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 聊聊Flink的必知必會(三) 聊聊Flink必知必會(四) 從源碼中,根據關鍵的代碼,梳理一下Flink中的時間與視窗實現邏輯。 WindowedStream 對數據流執行keyBy()操作後,再調用window()方法,就會返回WindowedStream,表示分區後又加窗的數據流。如果數據流沒 ...
  • 大家好,我是棧長。 今天給大家宣佈一個重大消息,又一國產項目宣佈加入 Apache,那就是 Alibaba 開源的分散式事務開源項目:Seata,Apache Seata 來了! 恭喜 Seata 成功加入 Apache 孵化器,走向全球。 說到 Seata,相信使用 Spring Cloud Al ...
  • 學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】 第十章、對象的生命周期 1.什麼是對象的生命周期 指的是一個對象創建、存活、消亡的一個完整過程 2.為什麼要學習對象的生命周期 由Spring負責對象的創 ...
  • 一、概述 生成PDF文檔通常涉及使用模板引擎、PDF庫以及數據填充。常見以下幾種方法: iText:iText是一個強大的PDF庫,支持創建和操作PDF文檔。使用場景: 您可以使用iText來直接構建PDF文檔,也可以將其與模板引擎結合使用,通過數據填充來生成PDF。 Apache PDFBox: ...
  • Go語言中的上下文(Context)是一種用於在 Goroutines 之間傳遞取消信號、截止時間和其他請求範圍值的標準方式。context 包提供了 Context 類型和一些相關的函數,用於在併發程式中有效地傳遞上下文信息。 在Go語言中,上下文通常用於以下場景: 請求的傳遞:當一個請求從客戶端 ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,四層TCP/UDP轉發,內網穿透,後續將實現websocket代理等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee.com/tic ...
  • 引言 上一篇中 WPF 重寫DataGrid樣式,因新產品UI需要,重寫了一下微軟 WPF 原生的 DataGrid 的樣式,包含如下內容: 基礎設置,一些基本背景色,字體顏色等。 滾動條樣式。 實現圓角表格,重寫表格的一些基礎樣式,例如 CellStyle ,RowStyle,RowHeaderS ...
  • 什麼是主構造函數 把參數添加到class與record的類聲明中就是主構造函數。例如 class Person(string name) { private string _name = name; } 這種寫法與以下代碼寫法一樣 class Person { private string _nam ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...