公司需將 Nginx 訪問日誌存入數據庫進行分析,但默認時間格式 [17/Jun/2013:14:42:13 +0400] 無法直接存入 DATETIME 類型字段,只能作字符串存儲,導致按天查詢分析極不方便。經研究發現需修改源碼重新編譯。本文記錄基於 Nginx 1.4.1 版本的完整修改流程。
| 原格式 | 目標格式 |
|---|---|
17/Jun/2013:14:42:13 +0400 | 2013-06-17 22:39:02 (標準 SQL DATETIME) |
src/core/ngx_times.c — 時間緩存生成邏輯src/http/modules/ngx_http_log_module.c — 日誌模塊時間字段定義ngx_times.c (三處關鍵點)// 原代碼
static u_char cached_http_log_time[NGX_TIME_SLOTS][sizeof("28/Sep/1970:12:00:00 +0600")];
// 修改後
static u_char cached_http_log_time[NGX_TIME_SLOTS][sizeof("1970-09-28 12:00:00")];
// 原代碼
ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1;
// 修改後
ngx_cached_http_log_time.len = sizeof("1970-09-28 12:00:00") - 1;
// 原代碼
p2 = &cached_http_log_time[slot][0];
(void) ngx_sprintf(p2, "%02d/%s/%d:%02d:%02d:%02d %c%02d%02d",
tm.ngx_tm_mday,
months[tm.ngx_tm_mon - 1],
tm.ngx_tm_year,
tm.ngx_tm_hour,
tm.ngx_tm_min,
tm.ngx_tm_sec,
tp->gmtoff < 0 ? '-' : '+',
ngx_abs(tp->gmtoff / 60),
ngx_abs(tp->gmtoff % 60));
// 修改後:標準 ISO 格式,去除時區偏移(或按需保留)
p2 = &cached_http_log_time[slot][0];
(void) ngx_sprintf(p2, "%4d-%02d-%02d %02d:%02d:%02d",
tm.ngx_tm_year,
tm.ngx_tm_mon,
tm.ngx_tm_mday,
tm.ngx_tm_hour,
tm.ngx_tm_min,
tm.ngx_tm_sec
// 如需時區可保留後三參數
);
說明:此處實際是將 HTTP 日誌時間格式(原為
p2)改為與緩存時間(p1)一致的標準格式。若需保留時區,可在格式字符串後追加%c%02d%02d及對應參數。
ngx_http_log_module.c (一處)// 原代碼
{ ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1, ... }
// 修改後
{ ngx_string("time_local"), sizeof("1970-09-28 12:00:00") - 1, ... }
此處長度必須與 ngx_times.c 中緩存長度一致,否則日誌輸出會截斷或越界。
# 進入源碼目錄
./configure --prefix=/usr/local/nginx # 按原安裝參數
make
make install
# 熱替換啟動
killall -9 nginx
/usr/local/nginx/sbin/nginx
[root@localhost objs]# tail -n 0 -f /usr/local/nginx/logs/access.log
10.10.8.120 - - [2013-06-18 03:24:24] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 ..."
10.10.8.120 - - [2013-06-18 03:24:24] "GET /favicon.ico HTTP/1.1" 404 570 "-" "Mozilla/5.0 ..."
時間格式已完美變為 [YYYY-MM-DD HH:MM:SS],可直接導入數據庫 DATETIME 字段,支持高效按天/小時分組查詢。
./configure 參數需與原安裝完全一致,否則模塊缺失本文參考網上資料整理,如有版權問題請聯系。更多技術博文請訪問:Linux開源技術博客 或 平凡的日子
本文出自 “平凡的日子” 博客,轉載請保留出處:原文鏈接