发布于 更新于
AI总结: 本文介绍了在Nginx中使用Lua脚本捕获请求和响应的头部及体,并通过白名单机制控制日志输出,以减少日志量。代码中通过设置变量和使用不同的Lua块来实现请求和响应数据的捕获,同时根据URI判断是否记录详细日志。
优化建议:
1. 考虑将白名单配置提取到外部文件,以便于管理和扩展。
2. 使用更高效的字符串拼接方式,例如table.concat,以减少内存占用和提高性能。
3. 增加错误处理机制,确保在读取请求体或文件时出现问题时能够记录相应的错误日志。
4. 考虑使用ngx.shared.DICT来存储白名单,以提高查找效率。
可以将配置放到http, server, location下, 用于不同范围 需修改白名单whitelist, 只打印关心的接口, 防止日志太多
# 初始化变量
set $req_headers "";
set $req_body "";
set $resp_headers "";
set $resp_body "";
access_by_lua_block {
-- 捕获请求头
local headers = ngx.req.get_headers()
local headers_str = ""
for k, v in pairs(headers) do
headers_str = headers_str .. " " .. k .. ": " .. v .. "\n"
end
ngx.var.req_headers = headers_str
-- 捕获请求体
ngx.req.read_body()
local body = ngx.req.get_body_data()
if not body then
local file = ngx.req.get_body_file()
if file then
local f = io.open(file, "rb")
body = f:read("*all")
f:close()
end
end
ngx.var.req_body = body or "-"
}
body_filter_by_lua_block {
local chunk = ngx.arg[1]
if chunk then
ngx.var.resp_body = (ngx.var.resp_body or "") .. chunk
end
}
log_by_lua_block {
-- 定义白名单 URI
local whitelist = {
["/translate"] = true,
["/test2"] = true
}
-- 获取当前请求的 URI
local uri = ngx.var.uri
-- 检查是否在白名单中
if whitelist[uri] then
local resp_headers = ngx.resp.get_headers()
local headers_str = ""
for k, v in pairs(resp_headers) do
headers_str = headers_str .. " " .. k .. ": " .. v .. "\n"
end
ngx.var.resp_headers = headers_str
local log_entry = string.format(
"\nRequest: %s\nHeaders: \n%sBody: %s\n\nResponse Status: %s\nHeaders: \n%sBody: %s\n",
ngx.var.request,
ngx.var.req_headers,
ngx.var.req_body,
ngx.var.status,
ngx.var.resp_headers,
ngx.var.resp_body or "-"
)
ngx.log(ngx.INFO, log_entry)
else
ngx.log(ngx.INFO, uri)
end
}