log stack traces
This commit is contained in:
@@ -324,6 +324,7 @@ var log_config = null
|
||||
var channel_sinks = {}
|
||||
var wildcard_sinks = []
|
||||
var warned_channels = {}
|
||||
var log_stack_enabled = false
|
||||
|
||||
function log(name, args) {
|
||||
var msg = args[0]
|
||||
@@ -476,15 +477,27 @@ function load_log_config() {
|
||||
}
|
||||
}
|
||||
build_sink_routing()
|
||||
log_stack_enabled = log_config.stack == true
|
||||
}
|
||||
|
||||
function pretty_format(rec) {
|
||||
var aid = text(rec.actor_id, 0, 5)
|
||||
var src = ""
|
||||
var ev = null
|
||||
var out = null
|
||||
var i = 0
|
||||
var fr = null
|
||||
if (rec.source && rec.source.file)
|
||||
src = rec.source.file + ":" + text(rec.source.line)
|
||||
var ev = is_text(rec.event) ? rec.event : json.encode(rec.event, false)
|
||||
return `[${aid}] [${rec.channel}] ${src} ${ev}\n`
|
||||
ev = is_text(rec.event) ? rec.event : json.encode(rec.event, false)
|
||||
out = `[${aid}] [${rec.channel}] ${src} ${ev}\n`
|
||||
if (rec.stack && length(rec.stack) > 0) {
|
||||
for (i = 0; i < length(rec.stack); i = i + 1) {
|
||||
fr = rec.stack[i]
|
||||
out = out + ` at ${fr.fn} (${fr.file}:${text(fr.line)}:${text(fr.col)})\n`
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
function bare_format(rec) {
|
||||
@@ -523,6 +536,9 @@ load_log_config()
|
||||
log = function(name, args) {
|
||||
var sinks = channel_sinks[name]
|
||||
var event = args[0]
|
||||
var caller = null
|
||||
var stack = null
|
||||
var rec = null
|
||||
|
||||
if (!sinks && length(wildcard_sinks) == 0) {
|
||||
if (!warned_channels[name]) {
|
||||
@@ -532,14 +548,16 @@ log = function(name, args) {
|
||||
return
|
||||
}
|
||||
|
||||
var caller = caller_info(2)
|
||||
var rec = {
|
||||
caller = caller_info(2)
|
||||
if (log_stack_enabled) stack = os.stack(1)
|
||||
rec = {
|
||||
actor_id: _cell.id,
|
||||
timestamp: time.number(),
|
||||
channel: name,
|
||||
event: event,
|
||||
source: caller
|
||||
}
|
||||
if (stack) rec.stack = stack
|
||||
|
||||
if (sinks) arrfor(sinks, function(sink) { dispatch_to_sink(sink, rec) })
|
||||
arrfor(wildcard_sinks, function(sink) { dispatch_to_sink(sink, rec) })
|
||||
|
||||
@@ -674,6 +674,27 @@ static JSValue js_os_embedded_module(JSContext *js, JSValue self, int argc, JSVa
|
||||
return js_new_blob_stoned_copy(js, (void *)entry->data, entry->size);
|
||||
}
|
||||
|
||||
static JSValue js_os_stack(JSContext *js, JSValue self, int argc, JSValue *argv) {
|
||||
(void)self;
|
||||
int skip = 0;
|
||||
if (argc > 0) JS_ToInt32(js, &skip, argv[0]);
|
||||
|
||||
JSValue full = JS_GetStack(js);
|
||||
if (skip <= 0) return full;
|
||||
|
||||
int64_t n = 0;
|
||||
JS_GetLength(js, full, &n);
|
||||
if (skip >= (int)n) return JS_NewArray(js);
|
||||
|
||||
JS_FRAME(js);
|
||||
JS_ROOT(arr, JS_NewArray(js));
|
||||
for (int i = skip; i < (int)n; i++) {
|
||||
JSValue item = JS_GetPropertyNumber(js, full, i);
|
||||
JS_SetPropertyNumber(js, arr.val, i - skip, item);
|
||||
}
|
||||
JS_RETURN(arr.val);
|
||||
}
|
||||
|
||||
static const JSCFunctionListEntry js_os_funcs[] = {
|
||||
MIST_FUNC_DEF(os, platform, 0),
|
||||
MIST_FUNC_DEF(os, arch, 0),
|
||||
@@ -701,6 +722,7 @@ static const JSCFunctionListEntry js_os_funcs[] = {
|
||||
MIST_FUNC_DEF(os, random, 0),
|
||||
MIST_FUNC_DEF(os, getenv, 1),
|
||||
MIST_FUNC_DEF(os, qbe, 1),
|
||||
MIST_FUNC_DEF(os, stack, 1),
|
||||
};
|
||||
|
||||
JSValue js_core_os_use(JSContext *js) {
|
||||
|
||||
Reference in New Issue
Block a user