diff options
author | Matthew Wild <mwild1@gmail.com> | 2016-02-04 14:56:49 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2016-02-04 14:56:49 +0000 |
commit | a63d0d3c7ff34337ab4442532e54eb7bffd05d7e (patch) | |
tree | 19f0e3af60a45b80a08a260ebdee5084186824a3 /core | |
parent | e1fc04ae014bfc6b6283faf33017be9a5d60b1b3 (diff) | |
download | prosody-a63d0d3c7ff34337ab4442532e54eb7bffd05d7e.tar.gz prosody-a63d0d3c7ff34337ab4442532e54eb7bffd05d7e.zip |
loggingmanager: Call setvbuf on output files, defaulting to line-buffered, instead of manually calling flush(). Adds 'buffer_mode' option to sink configuration for stdout, console and file sinks.
Diffstat (limited to 'core')
-rw-r--r-- | core/loggingmanager.lua | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua index 15d2ee3c..259c2c44 100644 --- a/core/loggingmanager.lua +++ b/core/loggingmanager.lua @@ -15,6 +15,7 @@ local math_max, rep = math.max, string.rep; local os_date = os.date; local getstyle, setstyle = require "util.termcolours".getstyle, require "util.termcolours".setstyle; +-- COMPAT: This should no longer be needed since the addition of setvbuf calls if os.getenv("__FLUSH_LOG") then local io_flush = io.flush; local _io_write = io_write; @@ -157,7 +158,6 @@ local function reload_logging() logging_config = config.get("*", "log") or default_logging; - for name, sink_maker in pairs(old_sink_types) do log_sink_types[name] = sink_maker; end @@ -185,6 +185,10 @@ function log_sink_types.stdout(sink_config) timestamps = default_timestamp; -- Default format end + if sink_config.buffer_mode ~= false then + io.stdout:setvbuf(sink_config.buffer_mode or "line"); + end + return function (name, level, message, ...) sourcewidth = math_max(#name+2, sourcewidth); local namelen = #name; @@ -220,6 +224,10 @@ do timestamps = default_timestamp; -- Default format end + if sink_config.buffer_mode ~= false then + io.stdout:setvbuf(sink_config.buffer_mode or "line"); + end + return function (name, level, message, ...) sourcewidth = math_max(#name+2, sourcewidth); local namelen = #name; @@ -247,7 +255,12 @@ function log_sink_types.file(sink_config) if not logfile then return empty_function; end - local write, flush = logfile.write, logfile.flush; + + if sink_config.buffer_mode ~= false then + logfile:setvbuf(sink_config.buffer_mode or "line"); + end + + local write = logfile.write; local timestamps = sink_config.timestamps; @@ -264,7 +277,6 @@ function log_sink_types.file(sink_config) else write(logfile, name, "\t" , level, "\t", message, "\n"); end - flush(logfile); end; end |