可以将配置放到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 }将代码单独放logs.conf文件中, 然后通过include引入
include /data/nginx/conf.d/include/logs.conf;
# 初始化变量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 .. ": " .. tostring(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 content_type = ngx.header["Content-Type"] or "" -- 只保留文本或 JSON local is_text = content_type:find("^text/", 1, true) -- text/* local is_json = content_type:find("application/json", 1, true) -- 如果不是文本/JSON,直接返回 [blob] if not is_text and not is_json then ngx.arg[1] = "[blob]" ngx.arg[2] = true -- 标记为最后一块,结束流 return end -- 否则继续累积原始内容 local chunk = ngx.arg[1] if chunk then ngx.var.resp_body = (ngx.var.resp_body or "") .. chunk end}log_by_lua_block { local log_entry = string.format( "========================================\n%s\n%s\n%s\n\nResponse: %s\n%s\n=====================================", ngx.var.request, ngx.var.req_headers, ngx.var.req_body, ngx.var.status, ngx.var.resp_body or "" ) ngx.log(ngx.ALERT, log_entry)}