环境设置
我有 nginx 网络服务器和简单的后端应用程序。这个后端应用程序在特定条件下具有自定义响应标头(例如:X-Real-Status),并且它作为上游(反向代理)在 nginx 后面运行。现在我在 nginx 配置中使用 $upstream_http_x_real_status 有这个自定义标头值。
我的问题是:我有两种日志格式如下:
log_format req_format '$uri $request_method $status $request_time $http_host $upstream_response_time';
log_format req_format_v2 '$uri $request_method $upstream_http_x_real_status $request_time $http_host $upstream_response_time';
我想将这两种日志格式合并为一种,因为在某些情况下(托管事件、运行时错误等),我的自定义标头(upstream_http_x_real_status)未设置,并且 req_format_v2 打印空而不是状态(例如,响应状态为 504 Bad Gateway)。我想在 nginx 配置中有类似这样的内容:
# DANGER: obviously syntax error
# ------------------------------
$real_status = $upstream_http_x_real_status | $status
log_format new_req_format '$uri $request_method $real_status $request_time $http_host $upstream_response_time';
如何达到这个目的?
答案1
这应该很简单地图:
map $upstream_http_x_real_status $real_status {
# use $upstream... by default
default "$upstream_http_x_real_status";
# but if it's empty, just use $status
"" "$status";
}
log_format new_req_format '$uri $request_method $real_status $request_time $http_host $upstream_response_time';