Expose default std.log implementation

This allows root.log implementations to capture log messages, process them, and forward them to the default implementation if desired.
This commit is contained in:
Jonathan Marler 2021-06-24 04:11:28 -06:00
parent 31c49ad64d
commit 642f5df0ab

View File

@ -145,11 +145,26 @@ fn log(
if (@typeInfo(@TypeOf(root.log)) != .Fn) if (@typeInfo(@TypeOf(root.log)) != .Fn)
@compileError("Expected root.log to be a function"); @compileError("Expected root.log to be a function");
root.log(message_level, scope, format, args); root.log(message_level, scope, format, args);
} else if (std.Target.current.os.tag == .freestanding) { } else {
defaultLog(message_level, scope, format, args);
}
}
}
/// The default implementation for root.log. root.log may forward log messages
/// to this function.
pub fn defaultLog(
comptime message_level: Level,
comptime scope: @Type(.EnumLiteral),
comptime format: []const u8,
args: anytype,
) void {
if (std.Target.current.os.tag == .freestanding) {
// On freestanding one must provide a log function; we do not have // On freestanding one must provide a log function; we do not have
// any I/O configured. // any I/O configured.
return; return;
} else { }
const level_txt = switch (message_level) { const level_txt = switch (message_level) {
.emerg => "emergency", .emerg => "emergency",
.alert => "alert", .alert => "alert",
@ -166,8 +181,6 @@ fn log(
defer held.release(); defer held.release();
nosuspend stderr.print(level_txt ++ prefix2 ++ format ++ "\n", args) catch return; nosuspend stderr.print(level_txt ++ prefix2 ++ format ++ "\n", args) catch return;
} }
}
}
/// Returns a scoped logging namespace that logs all messages using the scope /// Returns a scoped logging namespace that logs all messages using the scope
/// provided here. /// provided here.