Skip to content

Commit 2e2e63a

Browse files
authored
Add files via upload
1 parent 93b5cb9 commit 2e2e63a

File tree

3 files changed

+101
-0
lines changed

3 files changed

+101
-0
lines changed

src/demuxlogger.jl

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
struct DemuxLogger <: AbstractLogger
2+
loggers::Vector{AbstractLogger}
3+
end
4+
5+
"""
6+
demux_global_logger!(loggers...; include_current=true)
7+
8+
Sets the global_logger to demux,
9+
so that messages are sent to all the loggers.
10+
If `include_current` is true, then messages are also sent to the old global logger.
11+
Normally this would be the ConsoleLogger in the REPL etc.
12+
"""
13+
function demux_global_logger!(loggers...; include_current=true)
14+
loggers = collect(loggers)
15+
if include_current
16+
push!(loggers, global_logger())
17+
end
18+
global_logger(DemuxLogger(loggers))
19+
end
20+
21+
function handle_message(demux::demux, level, message, _module, group, id, file, line; kwargs...)
22+
for logger in demux.loggers
23+
if shouldlog(logger, level, _module, group, id)
24+
handle_message(logger, level, message, _module, group, id, file, line; kwargs...)
25+
end
26+
end
27+
end
28+
29+
function shouldlog(demux::demux, level, _module, group, id)
30+
any(shouldlog(logger, level, _module, group, id) for logger in demux.loggers)
31+
end
32+
33+
function min_enabled_level(demux::demux)
34+
minimum(min_enabled_level(logger) for logger in demux.loggers)
35+
end
36+
37+
function catch_exceptions(demux::demux)
38+
any(catch_exceptions(logger) for logger in demux.loggers)
39+
end

src/filelogger.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
struct FileLogger <: AbstractLogger
2+
logger::SimpleLogger
3+
function FileLogger(path, level=Info; append=false)
4+
filehandle = open(path, append ? "a" : "w")
5+
this = new(SimpleLogger(filehandle, level))
6+
finalizer(this) do this
7+
close(filehandle)
8+
end
9+
end
10+
end
11+
12+
13+
function handle_message(filelogger::FileLogger, level, message, _module, group, id, file, line; kwargs...)
14+
handle_message(filelogger.logger, level, message, _module, group, id, file, line; kwargs...)
15+
end
16+
shouldlog(filelogger::FileLogger, level, _module, group, id) = shouldlog(filelogger.logger, level, _module, group, id)
17+
min_enabled_level(filelogger::FileLogger) = min_enabled_level(filelogger.logger)
18+
catch_exceptions(filelogger::FileLogger) = catch_exceptions(filelogger.logger)

src/filteredlogger.jl

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
"""
3+
FilteredLogger(filter, logger)
4+
5+
Wraps `logger` in a filter.
6+
While loggers intrinsictally have in built filtering mechanisms.
7+
Wrapping it in a FilterLogger allows for extract control,
8+
at the cost of a bit of overhead.
9+
10+
The `filter` should be a function that returns a boolean.
11+
`true` if the message should be logged and `false` if not.
12+
It should take as inputs:
13+
`level, message, _module, group, id, file, line; kwargs...)`
14+
15+
These argument come from the logging macro (@info`, `@warn` etc).
16+
17+
* `level::LogLevel` Warn, Info, etc,
18+
* `message::String` the message to be logged
19+
* `_module::Module` can be used to specify a different originating module from
20+
the source location of the message.
21+
* `group::Symbol` can be used to override the message group (this is
22+
normally derived from the base name of the source file).
23+
* `id::Symbol` can be used to override the automatically generated unique
24+
message identifier. This is useful if you need to very closely associate
25+
messages generated on different source lines.
26+
* `file::String` and `line::Int` can be used to override the apparent
27+
source location of a log message.
28+
* `kwargs...` any keyword or positional arguments to the logging macro.
29+
"""
30+
struct FilteredLogger{T,F} <: AbstractLogger where T<: AbstractLogger
31+
filter::F
32+
logger::SimpleLogger
33+
end
34+
35+
36+
function handle_message(filteredlogger::FilteredLogger, level, message, _module, group, id, file, line; kwargs...)
37+
if filteredlogger.filter(filteredlogger.logger, level, message, _module, group, id, file, line; kwargs...)
38+
handle_message(filteredlogger.logger, level, message, _module, group, id, file, line; kwargs...)
39+
end
40+
end
41+
42+
shouldlog(filteredlogger::FilteredLogger, level, _module, group, id) = shouldlog(filteredlogger.logger, level, _module, group, id)
43+
min_enabled_level(filteredlogger::FilteredLogger) = min_enabled_level(filteredlogger.logger)
44+
catch_exceptions(filteredlogger::FilteredLogger) = catch_exceptions(filteredlogger.logger)

0 commit comments

Comments
 (0)