nginx可通过http块中map指令将$status映射为“成功”“失败”等语义标签,再在log_format中引用实现日志状态分级标记;需用正则匹配2xx/3xx、4xx/5xx,设default兜底,并确保map定义在log_format之前。

在 Nginx 日志中,可以用 map 指令将 HTTP 状态码(如 200、404、500)映射为语义更清晰的字符串标签,比如“成功”或“失败”,便于后续日志分析或监控告警。
定义 map 块:按状态码分类打标
map 必须写在 http 块内,不能放在 server 或 location 中。它根据变量值匹配规则,生成新变量:
http {
map $status $request_result {
~^[23] "成功";
~^[45] "失败";
default "未知";
}
}-
$status是 Nginx 内置变量,代表响应状态码(字符串形式,如 "200"、"404") -
~^[23]表示以 2 或 3 开头的字符串(覆盖 2xx、3xx 成功类状态码) -
~^[45]匹配 4xx 和 5xx 客户端错误与服务端错误 -
default处理异常情况(如日志阶段未生成状态码时)
在 log_format 中引用映射结果
定义好 $request_result 后,把它加入自定义日志格式:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_result; # ← 新增字段这样每条日志末尾就会出现“成功”或“失败”,例如:
192.168.1.100 - - [10/Jan/2025:14:22:33 +0800] "GET /api/user HTTP/1.1" 200 124 "-" "curl/7.68.0" 成功
进阶:区分失败类型(可选)
若需更细粒度标记,可扩展 map 规则:
map $status $request_result {
~^2 "成功";
~^3 "重定向";
~^40[134] "未授权|禁止|不可用";
~^4 "客户端错误";
~^5 "服务端错误";
default "未知";
}注意:Nginx 的 map 不支持多级正则捕获或逻辑运算,复杂判断建议交由日志收集系统(如 Loki、ELK)处理。
验证与生效要点
- 修改配置后执行
nginx -t检查语法,再nginx -s reload生效 -
map是惰性求值的——只有在日志格式中实际引用了新变量,才会触发匹配计算 - 确保
log_format在map块之后定义(或至少在同一个http块内),否则变量不可见











