Software /
code /
prosody-modules
Comparison
mod_debug_traceback/mod_debug_traceback.lua @ 4214:5841d54cb6c6
mod_debug_traceback: Descendent of mod_traceback with some additional features
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 16 Oct 2020 14:23:10 +0100 |
child | 4217:983565f42063 |
comparison
equal
deleted
inserted
replaced
4213:93a980ac1816 | 4214:5841d54cb6c6 |
---|---|
1 module:set_global(); | |
2 | |
3 local traceback = require "util.debug".traceback; | |
4 local pposix = require "util.pposix"; | |
5 local os_date = os.date; | |
6 local render_filename = require "util.interpolation".new("%b{}", function (s) return s; end, { | |
7 yyyymmdd = function (t) | |
8 return os_date("%Y%m%d", t); | |
9 end; | |
10 hhmmss = function (t) | |
11 return os_date("%H%M%S", t); | |
12 end; | |
13 }); | |
14 | |
15 local count = 0; | |
16 | |
17 local function get_filename(filename_template) | |
18 filename_template = filename_template; | |
19 return render_filename(filename_template, { | |
20 paths = prosody.paths; | |
21 pid = pposix.getpid(); | |
22 count = count; | |
23 time = os.time(); | |
24 }); | |
25 end | |
26 | |
27 local default_filename_template = "{paths.data}/traceback-{pid}-{count}.log"; | |
28 local filename_template = module:get_option_string("debug_traceback_filename", default_filename_template); | |
29 local signal_name = module:get_option_string("debug_traceback_signal", "SIGUSR1"); | |
30 | |
31 function dump_traceback() | |
32 module:log("info", "Received %s, writing traceback", signal_name); | |
33 | |
34 local tb = traceback(); | |
35 module:fire_event("debug_traceback/triggered", { traceback = tb }); | |
36 | |
37 local f, err = io.open(get_filename(filename_template), "a+"); | |
38 if not f then | |
39 module:log("error", "Unable to write traceback: %s", err); | |
40 return; | |
41 end | |
42 f:write("-- Traceback generated at ", os.date("%b %d %H:%M:%S"), " --\n"); | |
43 f:write(traceback(), "\n"); | |
44 f:write("-- End of traceback --\n"); | |
45 f:close(); | |
46 count = count + 1; | |
47 end | |
48 | |
49 local mod_posix = module:depends("posix"); | |
50 if mod_posix.features and mod_posix.features.signal_events then | |
51 module:hook("signal/"..signal_name, dump_traceback); | |
52 else | |
53 require"util.signal".signal(signal_name, dump_traceback); | |
54 end |