X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Flogger.lua;h=3d1f1c8bffc7c7aa971c63db10feda513819e5d2;hb=393df1ec3b94bc57f5b30510e9c83000c07f9806;hp=42da9b578dfc96e434c58568fd1b1f177b5e3845;hpb=9ac5f3a98d27d916a2d42daf62f914ad1dc5fe29;p=prosody.git diff --git a/util/logger.lua b/util/logger.lua index 42da9b57..3d1f1c8b 100644 --- a/util/logger.lua +++ b/util/logger.lua @@ -1,79 +1,78 @@ --- Prosody IM v0.4 --- Copyright (C) 2008-2009 Matthew Wild --- Copyright (C) 2008-2009 Waqas Hussain --- +-- 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. -- -local format, rep = string.format, string.rep; -local io_write = io.write; local pcall = pcall; -local debug = debug; -local tostring = tostring; -local math_max = math.max; - -local config = require "core.configmanager"; -local log_sources = config.get("*", "core", "log_sources"); -local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; -local do_pretty_printing = not os.getenv("WINDIR"); local find = string.find; -local ipairs = ipairs; +local ipairs, pairs, setmetatable = ipairs, pairs, setmetatable; + +local _ENV = nil; + +local level_sinks = {}; -module "logger" +local make_logger; -local logstyles = {}; +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"); ---TODO: This should be done in config, but we don't have proper config yet -if do_pretty_printing then - logstyles["info"] = getstyle("bold"); - logstyles["warn"] = getstyle("bold", "yellow"); - logstyles["error"] = getstyle("bold", "red"); + 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 -local sourcewidth = 20; +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 outfunction = nil; + local logger = function (message, ...) + for i = 1,#level_handlers do + level_handlers[i](source_name, level, message, ...); + end + end -function init(name) - if log_sources then - local log_this = false; - for _, source in ipairs(log_sources) do - if find(name, source) then - log_this = true; - break; - 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 - - if not log_this then return function () end end end - - if name == "modulemanager" or name:match("^c2s") or name == "datamanager" then return function () end; end - - --name = nil; -- While this line is not commented, will automatically fill in file/line number info - local namelen = #name; - return function (level, message, ...) - if outfunction then return outfunction(name, level, message, ...); end - - sourcewidth = math_max(#name+2, sourcewidth); - if ... then - io_write(name, rep(" ", sourcewidth-namelen), getstring(logstyles[level], level), "\t", format(message, ...), "\n"); - else - io_write(name, rep(" ", sourcewidth-namelen), getstring(logstyles[level], level), "\t", message, "\n"); - end - end end -function setwriter(f) - local old_func = outfunction; - if not f then outfunction = nil; return true, old_func; end - local ok, ret = pcall(f, "logger", "info", "Switched logging output successfully"); - if ok then - outfunction = f; - ret = old_func; +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 - return ok, ret; end -return _M; +return { + init = init; + make_logger = make_logger; + reset = reset; + add_level_sink = add_level_sink; + new = make_logger; +};