mod_s2s: Keep the dns answer object around a while so plugins can look at it
[prosody.git] / util / logger.lua
index f93cafc12d2cdab559e57a1931d7a864ecddfade..26206d4d83379ff49b255372197c1fb891337f50 100644 (file)
@@ -1,36 +1,74 @@
+-- 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 = string.format;
-local print = print;
-local debug = debug;
-local tostring = tostring;
+local pcall = pcall;
 
-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, pairs, setmetatable = ipairs, pairs, setmetatable;
 
 module "logger"
 
-local logstyles = {};
+local level_sinks = {};
 
---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");
-end
+local make_logger;
 
 function init(name)
-       --name = nil; -- While this line is not commented, will automatically fill in file/line number info
-       return  function (level, message, ...)
-                               if not name then
-                                       local inf = debug.getinfo(3, 'Snl');
-                                       level = level .. ","..tostring(inf.short_src):match("[^/]*$")..":"..inf.currentline;
-                               end
-                               if ... then 
-                                       print(name, getstring(logstyles[level], level), format(message, ...));
-                               else
-                                       print(name, getstring(logstyles[level], level), message);
-                               end
+       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
 
-return _M;
\ No newline at end of file
+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
+
+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
+
+_M.new = make_logger;
+
+return _M;