@@ -9,6 +9,9 @@ interactive work with the Julia REPL.
99
1010Log levels less than `min_level` are filtered out.
1111
12+ This Logger is thread-safe, with locks for both orchestration of message
13+ limits i.e. `maxlog`, and writes to the stream.
14+
1215Message formatting can be controlled by setting keyword arguments:
1316
1417* `meta_formatter` is a function which takes the log event metadata
@@ -24,29 +27,30 @@ Message formatting can be controlled by setting keyword arguments:
2427"""
2528struct ConsoleLogger <: AbstractLogger
2629 stream:: IO
30+ stream_lock:: ReentrantLock
2731 min_level:: LogLevel
2832 meta_formatter
2933 show_limited:: Bool
3034 right_justify:: Int
3135 message_limits:: Dict{Any,Int}
32- lock :: ReentrantLock
36+ message_limits_lock :: ReentrantLock
3337end
3438function ConsoleLogger (stream:: IO , min_level= Info;
3539 meta_formatter= default_metafmt, show_limited= true ,
3640 right_justify= 0 )
37- ConsoleLogger (stream, min_level, meta_formatter,
41+ ConsoleLogger (stream, ReentrantLock (), min_level, meta_formatter,
3842 show_limited, right_justify, Dict {Any,Int} (), ReentrantLock ())
3943end
4044function ConsoleLogger (min_level= Info;
4145 meta_formatter= default_metafmt, show_limited= true ,
4246 right_justify= 0 )
43- ConsoleLogger (closed_stream, min_level, meta_formatter,
47+ ConsoleLogger (closed_stream, ReentrantLock (), min_level, meta_formatter,
4448 show_limited, right_justify, Dict {Any,Int} (), ReentrantLock ())
4549end
4650
4751
4852shouldlog (logger:: ConsoleLogger , level, _module, group, id) =
49- @lock logger. lock get (logger. message_limits, id, 1 ) > 0
53+ @lock logger. message_limits_lock get (logger. message_limits, id, 1 ) > 0
5054
5155min_enabled_level (logger:: ConsoleLogger ) = logger. min_level
5256
@@ -110,7 +114,7 @@ function handle_message(logger::ConsoleLogger, level::LogLevel, message, _module
110114 hasmaxlog = haskey (kwargs, :maxlog ) ? 1 : 0
111115 maxlog = get (kwargs, :maxlog , nothing )
112116 if maxlog isa Core. BuiltinInts
113- @lock logger. lock begin
117+ @lock logger. message_limits_lock begin
114118 remaining = get! (logger. message_limits, id, Int (maxlog):: Int )
115119 logger. message_limits[id] = remaining - 1
116120 remaining > 0 || return
@@ -188,6 +192,6 @@ function handle_message(logger::ConsoleLogger, level::LogLevel, message, _module
188192 end
189193
190194 b = take! (buf)
191- @lock logger. lock write (stream, b)
195+ @lock logger. stream_lock write (stream, b)
192196 nothing
193197end
0 commit comments