发布于 更新于
AI总结: 本文介绍了一个使用Lua脚本在Nginx中捕获和记录请求与响应信息的实现,包含请求头、请求体、响应头和响应体的处理,且通过白名单机制限制日志记录的内容,以减少日志量。
优化建议:
1. 在配置中添加注释,详细说明每个部分的功能,以提高代码可读性。
2. 考虑将白名单的URI配置外部化,方便后续管理和更新。
3. 在捕获请求体时,增加对大文件的处理逻辑,以避免内存占用过高。
4. 对于日志记录,建议使用异步日志处理方式,以减少对请求处理的影响。
5. 定期清理或归档日志文件,防止日志文件过大影响性能。
可以将配置放到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
}