Nginx OpenResty

发布于 更新于

可以将配置放到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)}