mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
106 lines
2.5 KiB
Lua
106 lines
2.5 KiB
Lua
-- Prosody IM
|
|
-- Copyright (C) 2008-2010 Matthew Wild
|
|
-- Copyright (C) 2008-2010 Waqas Hussain
|
|
--
|
|
-- This project is MIT/X11 licensed. Please see the
|
|
-- COPYING file in the source package for more information.
|
|
--
|
|
-- luacheck: ignore 213/level
|
|
|
|
local pairs = pairs;
|
|
local ipairs = ipairs;
|
|
local require = require;
|
|
local t_remove = table.remove;
|
|
|
|
local _ENV = nil;
|
|
-- luacheck: std none
|
|
|
|
local level_sinks = {};
|
|
|
|
local make_logger;
|
|
|
|
local function init(name)
|
|
local log_debug = make_logger(name, "debug");
|
|
local log_info = make_logger(name, "info");
|
|
local log_warn = make_logger(name, "warn");
|
|
local log_error = make_logger(name, "error");
|
|
|
|
return function (level, message, ...)
|
|
if level == "debug" then
|
|
return log_debug(message, ...);
|
|
elseif level == "info" then
|
|
return log_info(message, ...);
|
|
elseif level == "warn" then
|
|
return log_warn(message, ...);
|
|
elseif level == "error" then
|
|
return log_error(message, ...);
|
|
end
|
|
end
|
|
end
|
|
|
|
function make_logger(source_name, level)
|
|
local level_handlers = level_sinks[level];
|
|
if not level_handlers then
|
|
level_handlers = {};
|
|
level_sinks[level] = level_handlers;
|
|
end
|
|
|
|
local logger = function (message, ...)
|
|
for i = 1,#level_handlers do
|
|
level_handlers[i](source_name, level, message, ...);
|
|
end
|
|
end
|
|
|
|
return logger;
|
|
end
|
|
|
|
local function reset()
|
|
for level, handler_list in pairs(level_sinks) do
|
|
-- Clear all handlers for this level
|
|
for i = 1, #handler_list do
|
|
handler_list[i] = nil;
|
|
end
|
|
end
|
|
end
|
|
|
|
local function add_level_sink(level, sink_function)
|
|
if not level_sinks[level] then
|
|
level_sinks[level] = { sink_function };
|
|
else
|
|
level_sinks[level][#level_sinks[level] + 1 ] = sink_function;
|
|
end
|
|
end
|
|
|
|
local function add_simple_sink(simple_sink_function, levels)
|
|
local format = require "prosody.util.format".format;
|
|
local function sink_function(name, level, msg, ...)
|
|
return simple_sink_function(name, level, format(msg, ...));
|
|
end
|
|
for _, level in ipairs(levels or {"debug", "info", "warn", "error"}) do
|
|
add_level_sink(level, sink_function);
|
|
end
|
|
return sink_function;
|
|
end
|
|
|
|
local function remove_sink(sink_function)
|
|
local removed;
|
|
for level, sinks in pairs(level_sinks) do
|
|
for i = #sinks, 1, -1 do
|
|
if sinks[i] == sink_function then
|
|
t_remove(sinks, i);
|
|
removed = true;
|
|
end
|
|
end
|
|
end
|
|
return removed;
|
|
end
|
|
|
|
return {
|
|
init = init;
|
|
make_logger = make_logger;
|
|
reset = reset;
|
|
add_level_sink = add_level_sink;
|
|
add_simple_sink = add_simple_sink;
|
|
new = make_logger;
|
|
remove_sink = remove_sink;
|
|
};
|