Files
kong--kong/kong/runloop/log_level.lua
T
2026-07-13 12:32:21 +08:00

90 lines
2.0 KiB
Lua

if ngx.config.subsystem ~= "http" then
return {
init_worker = function() end,
}
end
-- http subsystem
local cjson = require("cjson")
local constants = require("kong.constants")
local kong_log = require("resty.kong.log")
local ngx = ngx
local log = ngx.log
local ERR = ngx.ERR
local NOTICE = ngx.NOTICE
local function set_log_level(worker, level, timeout)
local ok, err = pcall(kong_log.set_log_level, level, timeout)
if not ok then
log(ERR, "worker" , worker, " failed setting log level: ", err)
return
end
log(NOTICE, "log level changed to ", level, " for worker ", worker)
end
-- if worker has outdated log level (e.g. newly spawned), updated it
local function init_handler()
local shm_log_level = ngx.shared.kong:get(constants.DYN_LOG_LEVEL_KEY)
local cur_log_level = kong_log.get_log_level()
local timeout = (tonumber(
ngx.shared.kong:get(constants.DYN_LOG_LEVEL_TIMEOUT_AT_KEY)) or 0)
- ngx.time()
if shm_log_level and cur_log_level ~= shm_log_level and timeout > 0 then
set_log_level(ngx.worker.id() or -1, shm_log_level, timeout)
end
end
-- log level cluster event updates
local function cluster_handler(data)
log(NOTICE, "log level cluster event received")
if not data then
kong.log.err("received empty data in cluster_events subscription")
return
end
local ok, err = kong.worker_events.post("debug", "log_level", cjson.decode(data))
if not ok then
kong.log.err("failed broadcasting to workers: ", err)
return
end
log(NOTICE, "log level event posted for node")
end
-- log level worker event updates
local function worker_handler(data)
local worker = ngx.worker.id() or -1
log(NOTICE, "log level worker event received for worker ", worker)
set_log_level(worker, data.log_level, data.timeout)
end
local function init_worker()
ngx.timer.at(0, init_handler)
kong.cluster_events:subscribe("log_level", cluster_handler)
kong.worker_events.register(worker_handler, "debug", "log_level")
end
return {
init_worker = init_worker,
}