解析 Nginx 日志中的时间,关键取决于你使用的是 哪种日志格式(默认或自定义)。下面从常见格式、字段含义、解析方法三个层面说明。
默认配置通常是:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
示例日志:
192.168.1.10 - - [10/Feb/2024:13:45:22 +0800] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0"
[10/Feb/2024:13:45:22 +0800]
对应变量:
$time_local格式说明:
dd/Mon/yyyy:HH:mm:ss ±zzzz
$time_iso8601(推荐,便于解析)如果你在 Nginx 中配置了:
log_format json escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status
'}';
示例:
{"time":"2024-02-10T13:45:22+08:00","remote_addr":"192.168.1.10","request":"GET / HTTP/1.1","status":200}
ISO8601 时间:
2024-02-10T13:45:22+08:00
✅ 更易解析,推荐用于日志分析系统
$time_local10/Feb/2024:13:45:22 +0800
| 部分 | 含义 |
|---|---|
| 10 | 日 |
| Feb | 月份缩写 |
| 2024 | 年 |
| 13:45:22 | 时:分:秒 |
| +0800 | 时区 |
$time_iso86012024-02-10T13:45:22+08:00
| 部分 | 含义 |
|---|---|
| T | 日期和时间分隔符 |
| +08:00 | 时区(ISO 标准) |
awk -F'[][]' '{print $2}' access.log | head
转换为标准时间:
date -d "10/Feb/2024:13:45:22 +0800" "+%Y-%m-%d %H:%M:%S"
$time_localfrom datetime import datetime
t = "10/Feb/2024:13:45:22 +0800"
dt = datetime.strptime(t, "%d/%b/%Y:%H:%M:%S %z")
print(dt)
$time_iso8601from datetime import datetime
t = "2024-02-10T13:45:22+08:00"
dt = datetime.fromisoformat(t)
print(dt)
import (
"time"
"fmt"
)
func main() {
t, _ := time.Parse("02/Jan/2006:15:04:05 -0700",
"10/Feb/2024:13:45:22 +0800")
fmt.Println(t)
}
\[%{HTTPDATE:timestamp}\]
time_local✅ 新项目推荐:
log_format json escape=json '{ "time":"$time_iso8601" }';
✅ 老日志:
strptime("%d/%b/%Y:%H:%M:%S %z")✅ 时区统一(避免 +0800 / UTC 混乱)
如果你有:
我可以给你精确解析代码。