【nginx】记录response body和header到access.log

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中数据如下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值