mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
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:
parent
31c49ad64d
commit
642f5df0ab
1 changed files with 32 additions and 19 deletions
|
|
@ -145,30 +145,43 @@ fn log(
|
|||
if (@typeInfo(@TypeOf(root.log)) != .Fn)
|
||||
@compileError("Expected root.log to be a function");
|
||||
root.log(message_level, scope, format, args);
|
||||
} else if (std.Target.current.os.tag == .freestanding) {
|
||||
// On freestanding one must provide a log function; we do not have
|
||||
// any I/O configured.
|
||||
return;
|
||||
} else {
|
||||
const level_txt = switch (message_level) {
|
||||
.emerg => "emergency",
|
||||
.alert => "alert",
|
||||
.crit => "critical",
|
||||
.err => "error",
|
||||
.warn => "warning",
|
||||
.notice => "notice",
|
||||
.info => "info",
|
||||
.debug => "debug",
|
||||
};
|
||||
const prefix2 = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "): ";
|
||||
const stderr = std.io.getStdErr().writer();
|
||||
const held = std.debug.getStderrMutex().acquire();
|
||||
defer held.release();
|
||||
nosuspend stderr.print(level_txt ++ prefix2 ++ format ++ "\n", args) catch return;
|
||||
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
|
||||
// any I/O configured.
|
||||
return;
|
||||
}
|
||||
|
||||
const level_txt = switch (message_level) {
|
||||
.emerg => "emergency",
|
||||
.alert => "alert",
|
||||
.crit => "critical",
|
||||
.err => "error",
|
||||
.warn => "warning",
|
||||
.notice => "notice",
|
||||
.info => "info",
|
||||
.debug => "debug",
|
||||
};
|
||||
const prefix2 = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "): ";
|
||||
const stderr = std.io.getStdErr().writer();
|
||||
const held = std.debug.getStderrMutex().acquire();
|
||||
defer held.release();
|
||||
nosuspend stderr.print(level_txt ++ prefix2 ++ format ++ "\n", args) catch return;
|
||||
}
|
||||
|
||||
/// Returns a scoped logging namespace that logs all messages using the scope
|
||||
/// provided here.
|
||||
pub fn scoped(comptime scope: @Type(.EnumLiteral)) type {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue