Commit 93bdd04e88

Lee Cannon <leecannon@leecannon.xyz>
2022-10-26 22:03:02
std.log: add functionality to check if a specific log level and scope are enabled
1 parent 4fa027a
Changed files (1)
lib
lib/std/log.zig
@@ -29,9 +29,9 @@
 //!     args: anytype,
 //! ) void {
 //!     // Ignore all non-error logging from sources other than
-//!     // .my_project, .nice_library and .default
+//!     // .my_project, .nice_library and the default
 //!     const scope_prefix = "(" ++ switch (scope) {
-//!         .my_project, .nice_library, .default => @tagName(scope),
+//!         .my_project, .nice_library, std.log.default_log_scope => @tagName(scope),
 //!         else => if (@enumToInt(level) <= @enumToInt(std.log.Level.err))
 //!             @tagName(scope)
 //!         else
@@ -125,22 +125,28 @@ fn log(
     comptime format: []const u8,
     args: anytype,
 ) void {
-    const effective_log_level = blk: {
-        inline for (scope_levels) |scope_level| {
-            if (scope_level.scope == scope) break :blk scope_level.level;
-        }
-        break :blk level;
-    };
+    if (comptime !logEnabled(message_level, scope)) return;
+
+    if (@hasDecl(root, "log")) {
+        if (@typeInfo(@TypeOf(root.log)) != .Fn)
+            @compileError("Expected root.log to be a function");
+        root.log(message_level, scope, format, args);
+    } else {
+        defaultLog(message_level, scope, format, args);
+    }
+}
 
-    if (@enumToInt(message_level) <= @enumToInt(effective_log_level)) {
-        if (@hasDecl(root, "log")) {
-            if (@typeInfo(@TypeOf(root.log)) != .Fn)
-                @compileError("Expected root.log to be a function");
-            root.log(message_level, scope, format, args);
-        } else {
-            defaultLog(message_level, scope, format, args);
-        }
+/// Determine if a specific log message level and scope combination are enabled for logging.
+pub fn logEnabled(comptime message_level: Level, comptime scope: @Type(.EnumLiteral)) bool {
+    inline for (scope_levels) |scope_level| {
+        if (scope_level.scope == scope) return @enumToInt(message_level) <= @enumToInt(scope_level.level);
     }
+    return @enumToInt(message_level) <= @enumToInt(level);
+}
+
+/// Determine if a specific log message level using the default log scope is enabled for logging.
+pub fn defaultLogEnabled(comptime message_level: Level) bool {
+    return comptime logEnabled(message_level, default_log_scope);
 }
 
 /// The default implementation for root.log.  root.log may forward log messages
@@ -210,8 +216,10 @@ pub fn scoped(comptime scope: @Type(.EnumLiteral)) type {
     };
 }
 
+pub const default_log_scope = .default;
+
 /// The default scoped logging namespace.
-pub const default = scoped(.default);
+pub const default = scoped(default_log_scope);
 
 /// Log an error message using the default scope. This log level is intended to
 /// be used when something has gone wrong. This might be recoverable or might