Skip to content

Commit 13db80c

Browse files
committed
Fix cycle between configuration and logging
1 parent 8b2d248 commit 13db80c

File tree

2 files changed

+86
-86
lines changed

2 files changed

+86
-86
lines changed

lib/concurrent-ruby/concurrent/concern/logging.rb

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'logger'
2+
require 'concurrent/atomic/atomic_reference'
23

34
module Concurrent
45
module Concern
@@ -15,8 +16,6 @@ module Logging
1516
# @param [String, nil] message when nil block is used to generate the message
1617
# @yieldreturn [String] a message
1718
def log(level, progname, message = nil, &block)
18-
#NOTE: Cannot require 'concurrent/configuration' above due to circular references.
19-
# Assume that the gem has been initialized if we've gotten this far.
2019
logger = if defined?(@logger) && @logger
2120
@logger
2221
else
@@ -30,3 +29,88 @@ def log(level, progname, message = nil, &block)
3029
end
3130
end
3231
end
32+
33+
module Concurrent
34+
extend Concern::Logging
35+
36+
# @return [Logger] Logger with provided level and output.
37+
def self.create_simple_logger(level = Logger::FATAL, output = $stderr)
38+
# TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking
39+
lambda do |severity, progname, message = nil, &block|
40+
return false if severity < level
41+
42+
message = block ? block.call : message
43+
formatted_message = case message
44+
when String
45+
message
46+
when Exception
47+
format "%s (%s)\n%s",
48+
message.message, message.class, (message.backtrace || []).join("\n")
49+
else
50+
message.inspect
51+
end
52+
53+
output.print format "[%s] %5s -- %s: %s\n",
54+
Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'),
55+
Logger::SEV_LABEL[severity],
56+
progname,
57+
formatted_message
58+
true
59+
end
60+
end
61+
62+
# Use logger created by #create_simple_logger to log concurrent-ruby messages.
63+
def self.use_simple_logger(level = Logger::FATAL, output = $stderr)
64+
Concurrent.global_logger = create_simple_logger level, output
65+
end
66+
67+
# @return [Logger] Logger with provided level and output.
68+
# @deprecated
69+
def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr)
70+
logger = Logger.new(output)
71+
logger.level = level
72+
logger.formatter = lambda do |severity, datetime, progname, msg|
73+
formatted_message = case msg
74+
when String
75+
msg
76+
when Exception
77+
format "%s (%s)\n%s",
78+
msg.message, msg.class, (msg.backtrace || []).join("\n")
79+
else
80+
msg.inspect
81+
end
82+
format "[%s] %5s -- %s: %s\n",
83+
datetime.strftime('%Y-%m-%d %H:%M:%S.%L'),
84+
severity,
85+
progname,
86+
formatted_message
87+
end
88+
89+
lambda do |loglevel, progname, message = nil, &block|
90+
logger.add loglevel, message, progname, &block
91+
end
92+
end
93+
94+
# Use logger created by #create_stdlib_logger to log concurrent-ruby messages.
95+
# @deprecated
96+
def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr)
97+
Concurrent.global_logger = create_stdlib_logger level, output
98+
end
99+
100+
# TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods
101+
102+
# Suppresses all output when used for logging.
103+
NULL_LOGGER = lambda { |level, progname, message = nil, &block| }
104+
105+
# @!visibility private
106+
GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN))
107+
private_constant :GLOBAL_LOGGER
108+
109+
def self.global_logger
110+
GLOBAL_LOGGER.value
111+
end
112+
113+
def self.global_logger=(value)
114+
GLOBAL_LOGGER.value = value
115+
end
116+
end

lib/concurrent-ruby/concurrent/configuration.rb

Lines changed: 0 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,18 @@
11
require 'thread'
22
require 'concurrent/delay'
33
require 'concurrent/errors'
4-
require 'concurrent/atomic/atomic_reference'
5-
require 'concurrent/concern/logging'
64
require 'concurrent/concern/deprecation'
75
require 'concurrent/executor/immediate_executor'
86
require 'concurrent/executor/cached_thread_pool'
97
require 'concurrent/utility/processor_counter'
108

119
module Concurrent
12-
extend Concern::Logging
1310
extend Concern::Deprecation
1411

1512
autoload :Options, 'concurrent/options'
1613
autoload :TimerSet, 'concurrent/executor/timer_set'
1714
autoload :ThreadPoolExecutor, 'concurrent/executor/thread_pool_executor'
1815

19-
# @return [Logger] Logger with provided level and output.
20-
def self.create_simple_logger(level = Logger::FATAL, output = $stderr)
21-
# TODO (pitr-ch 24-Dec-2016): figure out why it had to be replaced, stdlogger was deadlocking
22-
lambda do |severity, progname, message = nil, &block|
23-
return false if severity < level
24-
25-
message = block ? block.call : message
26-
formatted_message = case message
27-
when String
28-
message
29-
when Exception
30-
format "%s (%s)\n%s",
31-
message.message, message.class, (message.backtrace || []).join("\n")
32-
else
33-
message.inspect
34-
end
35-
36-
output.print format "[%s] %5s -- %s: %s\n",
37-
Time.now.strftime('%Y-%m-%d %H:%M:%S.%L'),
38-
Logger::SEV_LABEL[severity],
39-
progname,
40-
formatted_message
41-
true
42-
end
43-
end
44-
45-
# Use logger created by #create_simple_logger to log concurrent-ruby messages.
46-
def self.use_simple_logger(level = Logger::FATAL, output = $stderr)
47-
Concurrent.global_logger = create_simple_logger level, output
48-
end
49-
50-
# @return [Logger] Logger with provided level and output.
51-
# @deprecated
52-
def self.create_stdlib_logger(level = Logger::FATAL, output = $stderr)
53-
logger = Logger.new(output)
54-
logger.level = level
55-
logger.formatter = lambda do |severity, datetime, progname, msg|
56-
formatted_message = case msg
57-
when String
58-
msg
59-
when Exception
60-
format "%s (%s)\n%s",
61-
msg.message, msg.class, (msg.backtrace || []).join("\n")
62-
else
63-
msg.inspect
64-
end
65-
format "[%s] %5s -- %s: %s\n",
66-
datetime.strftime('%Y-%m-%d %H:%M:%S.%L'),
67-
severity,
68-
progname,
69-
formatted_message
70-
end
71-
72-
lambda do |loglevel, progname, message = nil, &block|
73-
logger.add loglevel, message, progname, &block
74-
end
75-
end
76-
77-
# Use logger created by #create_stdlib_logger to log concurrent-ruby messages.
78-
# @deprecated
79-
def self.use_stdlib_logger(level = Logger::FATAL, output = $stderr)
80-
Concurrent.global_logger = create_stdlib_logger level, output
81-
end
82-
83-
# TODO (pitr-ch 27-Dec-2016): remove deadlocking stdlib_logger methods
84-
85-
# Suppresses all output when used for logging.
86-
NULL_LOGGER = lambda { |level, progname, message = nil, &block| }
87-
88-
# @!visibility private
89-
GLOBAL_LOGGER = AtomicReference.new(create_simple_logger(Logger::WARN))
90-
private_constant :GLOBAL_LOGGER
91-
92-
def self.global_logger
93-
GLOBAL_LOGGER.value
94-
end
95-
96-
def self.global_logger=(value)
97-
GLOBAL_LOGGER.value = value
98-
end
99-
10016
# @!visibility private
10117
GLOBAL_FAST_EXECUTOR = Delay.new { Concurrent.new_fast_executor }
10218
private_constant :GLOBAL_FAST_EXECUTOR

0 commit comments

Comments
 (0)