nginx 自定义日志格式,用于记录存在时的标头值

nginx 自定义日志格式,用于记录存在时的标头值

环境设置

我有 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';

相关内容