Skip to content

Commit ff2644f

Browse files
quinnjoxinabox
andauthored
Deprecate verbosity macros (not compatible w/ juliac-compiled programs) (#94)
* Deprecate verbosity macros (not compatible w/ juliac-compiled programs) Add convenience group keyword to withlevel to do early filtering on groups Export withlevel * Update src/verbosity.jl Co-authored-by: Frames White <[email protected]> --------- Co-authored-by: Frames White <[email protected]>
1 parent ed2c622 commit ff2644f

File tree

3 files changed

+46
-45
lines changed

3 files changed

+46
-45
lines changed

src/LoggingExtras.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Base.CoreLogging:
1111
export TeeLogger, TransformerLogger, FileLogger,
1212
ActiveFilteredLogger, EarlyFilteredLogger, MinLevelLogger,
1313
DatetimeRotatingFileLogger, FormatLogger, LevelOverrideLogger,
14-
@debugv, @infov, @warnv, @errorv, @logmsgv
14+
@debugv, @infov, @warnv, @errorv, @logmsgv, withlevel
1515

1616
######
1717
# Re export Logging.jl from stdlib

src/verbosity.jl

+39-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function restore_callsite_source_position!(expr, src)
1+
function restore_callsite_source_position!(m, expr, src)
22
@assert expr.head == :escape
33
@assert expr.args[1].head == :macrocall
44
@assert expr.args[1].args[2] isa LineNumberNode
@@ -7,7 +7,15 @@ function restore_callsite_source_position!(expr, src)
77
# Logging.jl macros; otherwise, they would always report this (verbosity.jl)
88
# file as the logging callsite
99
expr.args[1].args[2] = src
10-
return expr
10+
ex = quote
11+
LoggingExtras.deprecate_verbosity($(Meta.quot(m)))
12+
$expr
13+
end
14+
return ex
15+
end
16+
17+
function deprecate_verbosity(m)
18+
Base.depwarn("Verbosity logging macros are deprecated as they are not compatible with juliac-compiled programs", m)
1119
end
1220

1321
vlogmacrodocs = """
@@ -34,56 +42,57 @@ end
3442

3543
"$vlogmacrodocs"
3644
macro debugv(verbosity::Int, msg, exs...)
37-
return restore_callsite_source_position!(
45+
return restore_callsite_source_position!(:debugv,
3846
esc(:($Base.@debug $msg _group=$(Verbosity(verbosity)) $(exs...))),
3947
__source__,
4048
)
4149
end
4250

4351
"$vlogmacrodocs"
4452
macro infov(verbosity::Int, msg, exs...)
45-
return restore_callsite_source_position!(
53+
return restore_callsite_source_position!(:infov,
4654
esc(:($Base.@info $msg _group=$(Verbosity(verbosity)) $(exs...))),
4755
__source__,
4856
)
4957
end
5058

5159
"$vlogmacrodocs"
5260
macro warnv(verbosity::Int, msg, exs...)
53-
return restore_callsite_source_position!(
61+
return restore_callsite_source_position!(:warnv,
5462
esc(:($Base.@warn $msg _group=$(Verbosity(verbosity)) $(exs...))),
5563
__source__,
5664
)
5765
end
5866

5967
"$vlogmacrodocs"
6068
macro errorv(verbosity::Int, msg, exs...)
61-
return restore_callsite_source_position!(
69+
return restore_callsite_source_position!(:errorv,
6270
esc(:($Base.@error $msg _group=$(Verbosity(verbosity)) $(exs...))),
6371
__source__,
6472
)
6573
end
6674

6775
"$vlogmacrodocs"
6876
macro logmsgv(verbosity::Int, level, msg, exs...)
69-
return restore_callsite_source_position!(
77+
return restore_callsite_source_position!(:logmsgv,
7078
esc(:($Base.@logmsg $level $msg _group=$(Verbosity(verbosity)) $(exs...))),
7179
__source__,
7280
)
7381
end
7482

7583
"""
76-
LoggingExtras.withlevel(f, level; verbosity::Integer=0)
84+
LoggingExtras.withlevel(f, level; verbosity::Integer=0, group::Union{Symbol, Nothing}=nothing)
7785
7886
Convenience function like `Logging.with_logger` to temporarily wrap
7987
the current logger with a level filter while `f` is executed.
8088
That is, the current logger will still be used for actual logging, but
8189
log messages will first be checked that they meet the `level`
8290
log level before being passed on to be logged.
8391
84-
For convenience, a `verbosity` keyword argument can be passed which also
85-
filters the "verbose logging" messages; see [`@debugv`](@ref), [`@infov`](@ref),
86-
[`@warnv`](@ref), [`@errorv`](@ref), and [`@logmsgv`](@ref).
92+
For convenience, a `group` keyword argument can be passed which also
93+
filters logging messages on the "group". By default, the group is the
94+
file name of the log macro call site, but can be overridden by passing
95+
the `_group` keyword argument to the logging macros.
8796
8897
!!! note
8998
@@ -95,11 +104,24 @@ filters the "verbose logging" messages; see [`@debugv`](@ref), [`@infov`](@ref),
95104
For more control directly construct the logger you want by making use of
96105
[`LevelOverrideLogger`](@ref) and then use `with_logger` to make it active.
97106
"""
98-
function withlevel(f, level::Union{Int, LogLevel}=Info; verbosity::Integer=0)
99-
with_logger(EarlyFilteredLogger(
100-
args -> !(args.group isa Verbosity) || verbosity >= args.group.verbosity,
101-
propagate_level_override(level, current_logger()))
102-
) do
103-
f()
107+
function withlevel(f, level::Union{Int, LogLevel}=Info; verbosity::Integer=0, group::Union{Symbol, Nothing}=nothing)
108+
if verbosity > 0
109+
deprecate_verbosity(:withlevel)
110+
end
111+
verbosity > 0 && group !== nothing && throw(ArgumentError("Cannot specify both verbosity and group"))
112+
if group === nothing
113+
with_logger(EarlyFilteredLogger(
114+
args -> !(args.group isa Verbosity) || verbosity >= args.group.verbosity,
115+
propagate_level_override(level, current_logger()))
116+
) do
117+
f()
118+
end
119+
else
120+
with_logger(EarlyFilteredLogger(
121+
args -> args.group === group,
122+
propagate_level_override(level, current_logger())
123+
)) do
124+
f()
125+
end
104126
end
105127
end

test/runtests.jl

+6-27
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,7 @@ end
255255
@test map(x -> x.level, logger.logs) == [Debug, Info]
256256
end
257257

258-
@testset "Verbosity utilities" begin
259-
logger = TestLogger(min_level=Info)
260-
with_logger(logger) do
261-
@infov 1 "info 1 message"
262-
end
263-
# if no verbosity filter is used, message is just like @info
264-
@test !isempty(logger.logs)
265-
258+
@testset "withlevel convenience" begin
266259
logger = TestLogger(min_level=Info)
267260
with_logger(logger) do
268261
LoggingExtras.withlevel(Debug) do
@@ -273,27 +266,13 @@ end
273266

274267
logger = TestLogger(min_level=Info)
275268
with_logger(logger) do
276-
LoggingExtras.withlevel(Debug; verbosity=1) do
277-
@debugv 0 "debug 0 message"
278-
@debugv 1 "debug 1 message"
279-
@debugv 2 "debug 2 message"
280-
# error message *also* isn't logged since
281-
# level *and* verbosity must match
282-
@errorv 2 "error 2 message"
283-
end
284-
end
285-
@test length(logger.logs) == 2
286-
@test logger.logs[1].group == LoggingExtras.Verbosity(0)
287-
@test logger.logs[2].group == LoggingExtras.Verbosity(1)
288-
289-
logger = TestLogger(min_level=Info)
290-
with_logger(logger) do
291-
with_logger(MinLevelLogger(current_logger(), Info)) do
292-
LoggingExtras.withlevel(Debug; verbosity=1) do
293-
@debug "This should show up, even though it is behind 2 info level filters"
294-
end
269+
LoggingExtras.withlevel(Debug; group=:foo) do
270+
@debug "debug message" _group=:foo
271+
@debug "debug message" _group=:bar
295272
end
296273
end
274+
@test logger.logs[1].level == Debug
275+
# test that we filtered on only foo group log messages
297276
@test length(logger.logs) == 1
298277
end
299278

0 commit comments

Comments
 (0)