Skip to content

Commit 641f717

Browse files
make custom log macros work (#52359)
1 parent aef528d commit 641f717

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

base/logging.jl

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ Alias for [`LogLevel(2000)`](@ref LogLevel).
159159
const Error = LogLevel( 2000)
160160
const AboveMaxLevel = LogLevel( 1000001)
161161

162+
# Global log limiting mechanism for super fast but inflexible global log limiting.
163+
const _min_enabled_level = Ref{LogLevel}(Debug)
164+
162165
function show(io::IO, level::LogLevel)
163166
if level == BelowMinLevel print(io, "BelowMinLevel")
164167
elseif level == Debug print(io, "Debug")
@@ -319,6 +322,15 @@ function issimplekw(@nospecialize val)
319322
return false
320323
end
321324

325+
# helper function to get the current logger, if enabled for the specified message type
326+
@noinline Base.@constprop :none function current_logger_for_env(std_level::LogLevel, group, _module)
327+
logstate = @inline current_logstate()
328+
if std_level >= logstate.min_enabled_level || env_override_minlevel(group, _module)
329+
return logstate.logger
330+
end
331+
return nothing
332+
end
333+
322334
# Generate code for logging macros
323335
function logmsg_code(_module, file, line, level, message, exs...)
324336
@nospecialize
@@ -370,23 +382,23 @@ function logmsg_code(_module, file, line, level, message, exs...)
370382
let
371383
level = $level
372384
# simplify std_level code emitted, if we know it is one of our global constants
373-
std_level = $(level isa Symbol ? :level : :(level isa LogLevel ? level : convert(LogLevel, level)::LogLevel))
374-
if std_level >= _min_enabled_level[]
385+
std_level = $(level isa Symbol ? :level : :(level isa $LogLevel ? level : convert($LogLevel, level)::$LogLevel))
386+
if std_level >= $(_min_enabled_level)[]
375387
group = $(log_data._group)
376388
_module = $(log_data._module)
377-
logger = current_logger_for_env(std_level, group, _module)
389+
logger = $(current_logger_for_env)(std_level, group, _module)
378390
if !(logger === nothing)
379391
id = $(log_data._id)
380392
# Second chance at an early bail-out (before computing the message),
381393
# based on arbitrary logger-specific logic.
382-
if invokelatest(shouldlog, logger, level, _module, group, id)
394+
if invokelatest($shouldlog, logger, level, _module, group, id)
383395
file = $(log_data._file)
384396
if file isa String
385397
file = Base.fixup_stdlib_path(file)
386398
end
387399
line = $(log_data._line)
388400
local msg, kwargs
389-
$(logrecord) && invokelatest(handle_message,
401+
$(logrecord) && invokelatest($handle_message,
390402
logger, level, msg, _module, group, id, file, line;
391403
kwargs...)
392404
end
@@ -481,9 +493,6 @@ function logmsg_shim(level, message, _module, group, id, file, line, kwargs)
481493
nothing
482494
end
483495

484-
# Global log limiting mechanism for super fast but inflexible global log limiting.
485-
const _min_enabled_level = Ref{LogLevel}(Debug)
486-
487496
# LogState - a cache of data extracted from the logger, plus the logger itself.
488497
struct LogState
489498
min_enabled_level::LogLevel
@@ -499,15 +508,6 @@ function current_logstate()
499508
return something(maybe, _global_logstate)::LogState
500509
end
501510

502-
# helper function to get the current logger, if enabled for the specified message type
503-
@noinline Base.@constprop :none function current_logger_for_env(std_level::LogLevel, group, _module)
504-
logstate = @inline current_logstate()
505-
if std_level >= logstate.min_enabled_level || env_override_minlevel(group, _module)
506-
return logstate.logger
507-
end
508-
return nothing
509-
end
510-
511511
with_logstate(f::Function, logstate) = @with(CURRENT_LOGSTATE => logstate, f())
512512

513513
#-------------------------------------------------------------------------------

stdlib/Logging/test/runtests.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import Logging: min_enabled_level, shouldlog, handle_message
66

77
@noinline func1() = backtrace()
88

9+
# see "custom log macro" testset
10+
CustomLog = LogLevel(-500)
11+
macro customlog(exs...) Base.CoreLogging.logmsg_code((Base.CoreLogging.@_sourceinfo)..., esc(CustomLog), exs...) end
12+
913
@testset "Logging" begin
1014

1115
@testset "Core" begin
@@ -275,4 +279,17 @@ end
275279
@test m.run()
276280
end
277281

282+
@testset "custom log macro" begin
283+
@test_logs (CustomLog, "a") min_level=CustomLog @customlog "a"
284+
285+
buf = IOBuffer()
286+
io = IOContext(buf, :displaysize=>(30,80), :color=>false)
287+
logger = ConsoleLogger(io, CustomLog)
288+
289+
with_logger(logger) do
290+
@customlog "a"
291+
end
292+
@test occursin("LogLevel(-500): a", String(take!(buf)))
293+
end
294+
278295
end

0 commit comments

Comments
 (0)