mod_console: Add host:* commands to help (thanks Zash)
[prosody.git] / core / loggingmanager.lua
index a8f6e1dc73a1a6429f21b68185e8e71833624610..f8cba059297057ed4c0147008cdad60266604975 100644 (file)
@@ -1,3 +1,11 @@
+-- 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 pcall = pcall;
@@ -9,21 +17,28 @@ local math_max, rep = math.max, string.rep;
 local os_date, os_getenv = os.date, os.getenv;
 local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring;
 
+if os.getenv("__FLUSH_LOG") then
+       local io_flush = io.flush;
+       local _io_write = io_write;
+       io_write = function(...) _io_write(...); io_flush(); end
+end
+
 local config = require "core.configmanager";
-local eventmanager = require "core.eventmanager";
 local logger = require "util.logger";
+local prosody = prosody;
+
 local debug_mode = config.get("*", "core", "debug");
 
 _G.log = logger.init("general");
 
 module "loggingmanager"
 
--- The log config used if none specified in the config file
-local default_logging = { { to = "console" } };
-local default_file_logging = { { to = "file", levels = { min = (debug_mode and "debug") or "info" } } };
-local default_timestamp = "%b %d %T";
+-- The log config used if none specified in the config file (see reload_logging for initialization)
+local default_logging;
+local default_file_logging;
+local default_timestamp = "%b %d %H:%M:%S";
 -- The actual config loggingmanager is using
-local logging_config = config.get("*", "core", "log") or default_logging;
+local logging_config;
 
 local apply_sink_rules;
 local log_sink_types = setmetatable({}, { __newindex = function (t, k, v) rawset(t, k, v); apply_sink_rules(k); end; });
@@ -80,7 +95,7 @@ function apply_sink_rules(sink_type)
                        end
                end
        elseif type(logging_config) == "string" and (not logging_config:match("^%*")) and sink_type == "file" then
-               -- User specified simply a filename, and the "file" sink type 
+               -- User specified simply a filename, and the "file" sink type
                -- was just added
                for _, sink_config in pairs(default_file_logging) do
                        sink_config.filename = logging_config;
@@ -114,7 +129,7 @@ function get_levels(criteria, set)
                                return set;
                        elseif in_range then
                                set[level] = true;
-                       end     
+                       end
                end
        end
        
@@ -124,6 +139,34 @@ function get_levels(criteria, set)
        return set;
 end
 
+-- Initialize config, etc. --
+function reload_logging()
+       local old_sink_types = {};
+       
+       for name, sink_maker in pairs(log_sink_types) do
+               old_sink_types[name] = sink_maker;
+               log_sink_types[name] = nil;
+       end
+       
+       logger.reset();
+
+       default_logging = { { to = "console" , levels = { min = (debug_mode and "debug") or "info" } } };
+       default_file_logging = { { to = "file", levels = { min = (debug_mode and "debug") or "info" }, timestamps = true } };
+       default_timestamp = "%b %d %H:%M:%S";
+
+       logging_config = config.get("*", "core", "log") or default_logging;
+       
+       
+       for name, sink_maker in pairs(old_sink_types) do
+               log_sink_types[name] = sink_maker;
+       end
+       
+       prosody.events.fire_event("logging-reloaded");
+end
+
+reload_logging();
+prosody.events.add_handler("config-reloaded", reload_logging);
+
 --- Definition of built-in logging sinks ---
 
 -- Null sink, must enter log_sink_types *first*
@@ -147,12 +190,12 @@ function log_sink_types.stdout()
                if timestamps then
                        io_write(os_date(timestamps), " ");
                end
-               if ... then 
+               if ... then
                        io_write(name, rep(" ", sourcewidth-namelen), level, "\t", format(message, ...), "\n");
                else
                        io_write(name, rep(" ", sourcewidth-namelen), level, "\t", message, "\n");
                end
-       end     
+       end
 end
 
 do
@@ -179,10 +222,11 @@ do
                return function (name, level, message, ...)
                        sourcewidth = math_max(#name+2, sourcewidth);
                        local namelen = #name;
+                       
                        if timestamps then
                                io_write(os_date(timestamps), " ");
                        end
-                       if ... then 
+                       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");
@@ -200,21 +244,15 @@ function log_sink_types.file(config)
        end
        local write, flush = logfile.write, logfile.flush;
 
-       eventmanager.add_event_hook("reopen-log-files", function ()
+       prosody.events.add_handler("logging-reloading", function ()
                        if logfile then
                                logfile:close();
                        end
-                       logfile = io_open(log, "a+");
-                       if not logfile then
-                               write, flush = empty_function, empty_function;
-                       else
-                               write, flush = logfile.write, logfile.flush;
-                       end
                end);
 
        local timestamps = config.timestamps;
 
-       if timestamps == true then
+       if timestamps == nil or timestamps == true then
                timestamps = default_timestamp; -- Default format
        end
 
@@ -222,7 +260,7 @@ function log_sink_types.file(config)
                if timestamps then
                        write(logfile, os_date(timestamps), " ");
                end
-               if ... then 
+               if ... then
                        write(logfile, name, "\t", level, "\t", format(message, ...), "\n");
                else
                        write(logfile, name, "\t" , level, "\t", message, "\n");