2017-09-05 16 views
0

在NGINX重写阶段之前是否有设置用户定义变量并在访问日志中使用它们的方法? 在某些错误情况下,如下面定义的那样,在设置任何用户变量之前,我们将在访问日志阶段结束。当标题读取超时时Nginx访问日志变量未设置

以下是访问日志格式例如我有:

log_format主 '$ REMOTE_ADDR $ SERVER_ADDR $ HTTP_HOST $ custom_destination_addr [$ custom_request_time]' ' “$请求” $状态$ body_bytes_sent “$ HTTP_USER_AGENT”' ;

以“custom_”开头的字段是用户定义的变量。

当我发送具有非终止标头的以下获取消息时;即以“/ r/n”而非“/ r/n/r/n”结尾的头部:

get =“GET /Vod/mod/video16k_1.mp4 HTTP/1.1 \ r \ n主机:10.20。 20.10:8585 \ r \ n用户代理:HTTP测试套件TestSuite/1.0.2 \ r \ n接受 - 语言:en-us,en; q = 0.5 \ r \ n接受编码:gzip,deflate \ r \ n连接:保留 - 活动\ r \ n“

我在error.log中获取以下信息: 28875#0:* 1客户端超时(110:连接超时)读取客户端请求标头时,客户端:10.20 .20.128,server:,请求:“GET /Vod/mod/video16k_1.mp4 HTTP/1.1”,主机:“10.20.20.10:8585”

然后,它生成一个访问日志条目,其中所有用户定义变量是发现未初始化:

2017/09/01 10:03:07 [警告] 28875#0:* 1使用未初始化的“custom_destination_addr”变量记录请求时,客户端:10.20.20.128,服务器:,请求:“GET/Vod/mod/video16k_1.mp4 HTTP/1.1“,主机:”10.20.20.10:8585“

2017/09/01 10:03:07 [警告] 28875#0:* 1使用未初始化的”custom_request_time“变量在登录请求,客户端:10.20.20.128,服务器:,请求: “GET /Vod/mod/video16k_1.mp4 HTTP/1.1”,主持人: “10.20.20.10:8585”

访问日志条目:

10.20.20.128 10.20.20.10 10.20。 20.10:8585 []“GET /Vod/mod/video16k_1.mp4 HTTP/1.1”408 0“”“HTTP Test Suite TestSuite/1.0.2”

当我正确设置标头尾部“/ r/n/r/n“,那么访问日志很好。

因此,在上述错误条件(读取标题时超时)下,用户定义的访问日志变量将全部变为空。

是否有已知的解决方案来解决这个问题,或者我们是否需要NGIMX中的新概念/特性来支持在重写阶段之前进行变量设置?

感谢

回答

0

张贴在回答评论,因为评论需要格式化

有关使用地图如何?

map $custom_request_time $custom_request_time_log { 
    default $custom_request_time; 
    '' 'Not Available'; 
} 

然后在日志中使用它?

log_format main '$remote_addr $server_addr $http_host $custom_destination_addr [$custom_request_time_log] ' ' "$request" $status $body_bytes_sent "$http_user_agent" '; 
+0

如果我必须在log_by_lua中使用lua代码做一些时间格式化,那么您如何在地图中设置变量的值? 如果您可以提供有关在地图上根据lua代码设置日志的详细信息,我们将不胜感激。 – developer

+0

你的代码需要使用'ngx.var.custom_request_time'设置'custom_request_time',其余部分将由map处理 –

+0

我的根本问题是: 是否可以在NGINX重写阶段之前为每个请求设置一个变量并使用它访问日志中的变量? – developer

相关问题