aboutsummaryrefslogtreecommitdiffstats
path: root/core/loggingmanager.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2010-07-14 01:25:32 +0100
committerMatthew Wild <mwild1@gmail.com>2010-07-14 01:25:32 +0100
commitb389ea00fc10f7ea6fb2c42762c888664afa8535 (patch)
tree5146540b1096651bdaf6f773c7678adfc30a82b9 /core/loggingmanager.lua
parent52cde37cdbebf309eca2999f873a236e9e83b942 (diff)
downloadprosody-b389ea00fc10f7ea6fb2c42762c888664afa8535.tar.gz
prosody-b389ea00fc10f7ea6fb2c42762c888664afa8535.zip
loggingmanager: Add reload_logging() method, which gets called on any config reload, to reset util.logger and remove and re-add all sink types to perform a full reload of the logging system without a restart.
Diffstat (limited to 'core/loggingmanager.lua')
-rw-r--r--core/loggingmanager.lua46
1 files changed, 35 insertions, 11 deletions
diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua
index 3ec696d5..2c1accd9 100644
--- a/core/loggingmanager.lua
+++ b/core/loggingmanager.lua
@@ -26,18 +26,20 @@ 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" , levels = { min = (debug_mode and "debug") or "info" } } };
-local default_file_logging = { { to = "file", levels = { min = (debug_mode and "debug") or "info" }, timestamps = true } };
+-- 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; });
@@ -138,6 +140,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*
@@ -215,16 +245,10 @@ 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;