Why not just define a new log level type? Since logging code mostly do duck typing, it works with a few methods and there is no need for type-piracy. The downside may be that some third-party loggers may explicitly expect LogLevel
.
using Logging
struct MyLogLevel
level::Int32
end
const Trace = MyLogLevel(-10_000)
Base.isless(a::MyLogLevel, b::LogLevel) = isless(a.level, b.level)
Base.isless(a::LogLevel, b::MyLogLevel) = isless(a.level, b.level)
Base.convert(::Type{LogLevel}, level::MyLogLevel) = LogLevel(level.level)
Base.show(io::IO, level::MyLogLevel) =
if level == Trace
print(io, "Trace")
else
show(io, LogLevel(level))
end
Logging.disable_logging(Logging.BelowMinLevel)
with_logger(ConsoleLogger(stderr, convert(LogLevel, Trace))) do
@logmsg Trace "message"
end