X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=core%2Floggingmanager.lua;h=a088a3f3d63616a2a29c6375786133384724aa0c;hb=d0a173fdc3e1d73fde38fb10c08c1d70c35f27cb;hp=5dff6a34539586116f78f761b8981e67779be902;hpb=e0d0b0fa0b49e963d91ec1711864cef4ce239c13;p=prosody.git diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua index 5dff6a34..a088a3f3 100644 --- a/core/loggingmanager.lua +++ b/core/loggingmanager.lua @@ -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; @@ -6,21 +14,28 @@ local tostring, setmetatable, rawset, pairs, ipairs, type = tostring, setmetatable, rawset, pairs, ipairs, type; local io_open, io_write = io.open, io.write; local math_max, rep = math.max, string.rep; -local os_getenv = os.getenv; +local os_date, os_getenv = os.date, os.getenv; local getstyle, getstring = require "util.termcolours".getstyle, require "util.termcolours".getstring; -local config = require "core.configmanager"; +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 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 = "info" } } }; - +local default_logging = { { to = "console" , levels = { min = (debug_mode and "debug" ) } } }; +local default_file_logging = { { to = "file", levels = { min = (debug_mode and "debug") or "info" }, timestamps = true } }; +local default_timestamp = "%b %d %H:%M:%S"; -- The actual config loggingmanager is using local logging_config = config.get("*", "core", "log") or default_logging; @@ -79,13 +94,16 @@ 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; add_rule(sink_config); sink_config.filename = nil; end + elseif type(logging_config) == "string" and logging_config:match("^%*(.+)") == sink_type then + -- Log all levels (debug+) to this sink + add_rule({ levels = { min = "debug" }, to = sink_type }); end end @@ -110,7 +128,7 @@ function get_levels(criteria, set) return set; elseif in_range then set[level] = true; - end + end end end @@ -122,6 +140,7 @@ end --- Definition of built-in logging sinks --- +-- Null sink, must enter log_sink_types *first* function log_sink_types.nowhere() return function () return false; end; end @@ -130,15 +149,24 @@ end local sourcewidth = 20; function log_sink_types.stdout() + local timestamps = config.timestamps; + + if timestamps == true then + timestamps = default_timestamp; -- Default format + end + return function (name, level, message, ...) sourcewidth = math_max(#name+2, sourcewidth); local namelen = #name; - if ... then + if timestamps then + io_write(os_date(timestamps), " "); + end + 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 @@ -156,10 +184,20 @@ do return log_sink_types.stdout(config); end + local timestamps = config.timestamps; + + if timestamps == true then + timestamps = default_timestamp; -- Default format + end + return function (name, level, message, ...) sourcewidth = math_max(#name+2, sourcewidth); local namelen = #name; - if ... then + + if timestamps then + io_write(os_date(timestamps), " "); + end + 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"); @@ -168,16 +206,38 @@ do end end +local empty_function = function () end; function log_sink_types.file(config) local log = config.filename; local logfile = io_open(log, "a+"); if not logfile then - return function () end + return empty_function; + end + local write, flush = logfile.write, logfile.flush; + + eventmanager.add_event_hook("reopen-log-files", 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 == nil or timestamps == true then + timestamps = default_timestamp; -- Default format end - local write, format, flush = logfile.write, format, logfile.flush; return function (name, level, message, ...) - if ... then + if timestamps then + write(logfile, os_date(timestamps), " "); + end + if ... then write(logfile, name, "\t", level, "\t", format(message, ...), "\n"); else write(logfile, name, "\t" , level, "\t", message, "\n");