1 背景
netstub项目中,需要记录经过网关的请求信息到日志,供loki采集,以便后续的统计分析工作。
需要记录请求的request_body, request_header, response_body, response_header数据到access.log。
本文记录一下配置过程。
2 配置
2.1 记录请求url
配置nginx配置文件default.conf ,使用nginx内置变量 $host 和$request即可获得url数据
log_format main escape=json '{'
'"host": "$host",'
'"request": "$request"'
'}' ;
access_log /var/log/nginx/access.log main;
2.2 记录请求body和header
① body:配置中打开lua_need_body_request on 即可将request_body 记录到$request_body变量
② header:header数据需要在header_filter_by_lua_block阶段中手动赋值,读取请求中的header信息赋值给$request_header 变量
修改后配置文件如下:
log_format main escape=json '{'
'"host": "$host",'
'"request": "$request",'
'"request_header": "$request_header",'
'"request_body": "$request_body"'
'}' ;
access_log /var/log/nginx/access.log main;
server {
# 记录请求body
lua_need_request_body on;
# 记录请求header
set $response_header "";
header_filter_by_lua_block {
json = require "cjson"
ngx.var.request_header = json.encode(ngx.req.get_headers())
}
}
2.3 记录返回body和header
① body:body数据需要在body_filter_by_lua_block阶段中手动赋值, 读取response body中的数据赋值给 $response_body 变量
② header:response header数据获取方式,同request header的获取方式一致。
完整配置如下
log_format main escape=json '{'
'"host": "$host",'
'"request": "$request",'
'"request_header": "$request_header",'
'"request_body": "$request_body",'
'"response_header": "$response_header",'
'"response_body": "$response_body"'
'}' ;
access_log /var/log/nginx/access.log main;
server {
# 记录请求body
lua_need_request_body on;
# 记录请求header和返回header
set $response_header "";
header_filter_by_lua_block {
json = require "cjson"
ngx.var.request_header = json.encode(ngx.req.get_headers())
ngx.var.response_header = json.encode(ngx.resp.get_headers())
ngx.var.request_query = json.encode(ngx.req.get_uri_args()) # 记录 request query 数据
}
# 记录返回body
set $response_body "";
body_filter_by_lua_block {
local response_body = string.sub(ngx.arg[1],1,10000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. response_body
if ngx.arg[2] then
ngx.var.response_body = ngx.ctx.buffered
end
}
}
3. 结果
查看loki中数据,可以看到access.log中数据如下


3246

被折叠的 条评论
为什么被折叠?



