annotate mod_log_ringbuffer/mod_log_ringbuffer.lua @ 6556:7477e97a9045

mod_firewall: Apply pre-reload state before re-reading config This change makes load/reload a bit more robust. module.load() runs before module.restore() and it reads from the config and updates the state (if needed). However, after this, module.restore() could run and apply the old state again.
author Matthew Wild <mwild1@gmail.com>
date Sun, 24 May 2026 20:03:20 +0100
parents 8a47791338fc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 module:set_global();
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local loggingmanager = require "core.loggingmanager";
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local format = require "util.format".format;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local pposix = require "util.pposix";
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local rb = require "util.ringbuffer";
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
7 local queue = require "util.queue";
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local default_timestamp = "%b %d %H:%M:%S ";
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local max_chunk_size = module:get_option_number("log_ringbuffer_chunk_size", 16384);
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local os_date = os.date;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
4215
86f8ece24029 mod_log_ringbuffer: Update default filename to include data path
Matthew Wild <mwild1@gmail.com>
parents: 4205
diff changeset
14 local default_filename_template = "{paths.data}/ringbuffer-logs-{pid}-{count}.log";
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local render_filename = require "util.interpolation".new("%b{}", function (s) return s; end, {
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 yyyymmdd = function (t)
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 return os_date("%Y%m%d", t);
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 end;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 hhmmss = function (t)
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 return os_date("%H%M%S", t);
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 });
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local dump_count = 0;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
26 local function dump_buffer(dump, filename)
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 dump_count = dump_count + 1;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 local f, err = io.open(filename, "a+");
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 if not f then
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 module:log("error", "Unable to open output file: %s", err);
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 return;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
33 f:write(("-- Dumping log buffer at %s --\n"):format(os_date(default_timestamp)));
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
34 dump(f);
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 f:write("-- End of dump --\n\n");
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 f:close();
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 local function get_filename(filename_template)
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 filename_template = filename_template or default_filename_template;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 return render_filename(filename_template, {
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 paths = prosody.paths;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 pid = pposix.getpid();
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 count = dump_count;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 time = os.time();
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 });
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
49 local function new_buffer(config)
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
50 local write, dump;
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
51
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
52 if config.lines then
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
53 local buffer = queue.new(config.lines, true);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
54 function write(line)
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
55 buffer:push(line);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
56 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
57 function dump(f)
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
58 -- COMPAT w/0.11 - update to use :consume()
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
59 for line in buffer.pop, buffer do
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
60 f:write(line);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
61 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
62 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
63 else
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
64 local buffer_size = config.size or 100*1024;
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
65 local buffer = rb.new(buffer_size);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
66 function write(line)
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
67 if not buffer:write(line) then
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
68 if #line > buffer_size then
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
69 buffer:discard(buffer_size);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
70 buffer:write(line:sub(-buffer_size));
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
71 else
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
72 buffer:discard(#line);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
73 buffer:write(line);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
74 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
75 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
76 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
77 function dump(f)
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
78 local bytes_remaining = buffer:length();
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
79 while bytes_remaining > 0 do
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
80 local chunk_size = math.min(bytes_remaining, max_chunk_size);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
81 local chunk = buffer:read(chunk_size);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
82 if not chunk then
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
83 return;
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
84 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
85 f:write(chunk);
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
86 bytes_remaining = bytes_remaining - chunk_size;
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
87 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
88 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
89 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
90 return write, dump;
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
91 end
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
92
5853
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
93 local event_hooks = {};
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
94
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 local function ringbuffer_log_sink_maker(sink_config)
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
96 local write, dump = new_buffer(sink_config);
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 local timestamps = sink_config.timestamps;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 if timestamps == true or timestamps == nil then
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 timestamps = default_timestamp; -- Default format
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 elseif timestamps then
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 timestamps = timestamps .. " ";
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
106 local function handler()
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
107 dump_buffer(dump, sink_config.filename or get_filename(sink_config.filename_template));
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 if sink_config.signal then
6333
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
111 local event_name = "signal/"..sink_config.signal;
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
112 module:hook_global(event_name, handler);
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
113 table.insert(event_hooks, { handler, event_name });
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
114 end
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
115 if sink_config.event then
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
116 module:hook_global(sink_config.event, handler);
6333
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
117 table.insert(event_hooks, { handler, sink_config.event });
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 return function (name, level, message, ...)
4225
d6fb9f7afaa5 mod_log_ringbuffer: Discard old data when buffer is full
Matthew Wild <mwild1@gmail.com>
parents: 4219
diff changeset
121 local line = format("%s%s\t%s\t%s\n", timestamps and os_date(timestamps) or "", name, level, format(message, ...));
4226
df2ccb42a241 mod_log_ringbuffer: Add 'lines' option (actually an alternative ringbuffer implementation)
Matthew Wild <mwild1@gmail.com>
parents: 4225
diff changeset
122 write(line);
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end;
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 end
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125
5853
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
126 module:hook_global("reopen-log-files", function()
6333
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
127 for i, entry in ipairs(event_hooks) do
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
128 local handler, event_name = entry[1], entry[2];
5853
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
129 module:unhook_object_event(prosody.events, event_name, handler);
6333
8a47791338fc mod_log_ringbuffer: Support multiple triggers simultaneously (e.g. signal + event)
Matthew Wild <mwild1@gmail.com>
parents: 5853
diff changeset
130 event_hooks[i] = nil;
5853
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
131 end
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
132 end, 1);
97c9b76867ca mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 5852
diff changeset
133
4205
481c4d75e77d mod_log_ringbuffer: New module to send logs to an in-memory ringbuffer
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 loggingmanager.register_sink_type("ringbuffer", ringbuffer_log_sink_maker);