Nginx自定义日志格式:如何优先使用上游自定义响应头值,缺失时回退默认状态码
Nginx自定义日志格式:如何优先使用上游自定义响应头值,缺失时回退默认状态码
嘿,这个需求其实用Nginx原生的变量默认值语法就能轻松搞定,完全不需要额外的复杂配置!
你想要的「优先用上游自定义头X-Real-Status的值,没有的话就用Nginx自身的$status状态码」,直接在日志格式里用变量默认值表达式就能实现:
log_format new_req_format '$uri $request_method ${upstream_http_x_real_status:-$status} $request_time $http_host $upstream_response_time';
解释一下这个语法:
${variable:-default_value}是Nginx的标准语法:如果variable变量存在且非空,就用它的值;如果变量为空(比如上游没返回X-Real-Status头),就自动替换成后面的default_value。- 这里我们把
default_value设为$status,刚好满足你的需求:上游有自定义头时用头的值,上游挂了(比如504网关超时)或者没返回这个头时,就用Nginx返回的实际状态码。
举个实际场景的例子:
- 当上游正常返回
X-Real-Status: 200时,日志里会输出这个自定义状态值; - 当上游宕机,Nginx返回504 Bad Gateway时,因为上游没返回
X-Real-Status,日志就会自动用$status的504来填充。
如果之后你需要更复杂的状态判断逻辑(比如针对不同场景设置不同默认值),可以考虑用map指令提前定义一个$real_status变量,但就你当前的需求来说,上面的日志格式写法已经足够简洁好用了!
备注:内容来源于stack exchange,提问作者sadegh mohebbi
相关产品推荐
相关产品推荐

