@@ -76,7 +76,6 @@ class BroadcastLogger
76
76
77
77
# Returns all the logger that are part of this broadcast.
78
78
attr_reader :broadcasts
79
- attr_reader :formatter
80
79
attr_accessor :progname
81
80
82
81
def initialize ( *loggers )
@@ -105,62 +104,36 @@ def stop_broadcasting_to(logger)
105
104
@broadcasts . delete ( logger )
106
105
end
107
106
108
- def level
109
- @broadcasts . map ( &:level ) . min
110
- end
111
-
112
- def <<( message )
113
- dispatch { |logger | logger . <<( message ) }
114
- end
115
-
116
- def add ( ...)
117
- dispatch { |logger | logger . add ( ...) }
118
- end
119
- alias_method :log , :add
120
-
121
- def debug ( ...)
122
- dispatch { |logger | logger . debug ( ...) }
123
- end
124
-
125
- def info ( ...)
126
- dispatch { |logger | logger . info ( ...) }
127
- end
128
-
129
- def warn ( ...)
130
- dispatch { |logger | logger . warn ( ...) }
131
- end
132
-
133
- def error ( ...)
134
- dispatch { |logger | logger . error ( ...) }
135
- end
136
-
137
- def fatal ( ...)
138
- dispatch { |logger | logger . fatal ( ...) }
139
- end
140
-
141
- def unknown ( ...)
142
- dispatch { |logger | logger . unknown ( ...) }
107
+ def local_level = ( level )
108
+ @broadcasts . each do |logger |
109
+ logger . local_level = level if logger . respond_to? ( :local_level= )
110
+ end
143
111
end
144
112
145
- def formatter = ( formatter )
146
- dispatch { |logger | logger . formatter = formatter }
147
-
148
- @formatter = formatter
149
- end
113
+ def local_level
114
+ loggers = @broadcasts . select { |logger | logger . respond_to? ( :local_level ) }
150
115
151
- def level = ( level )
152
- dispatch { |logger | logger . level = level }
116
+ loggers . map do |logger |
117
+ logger . local_level
118
+ end . first
153
119
end
154
- alias_method :sev_threshold= , :level=
155
120
156
- def local_level = ( level )
157
- dispatch do |logger |
158
- logger . local_level = level if logger . respond_to? ( :local_level= )
159
- end
121
+ LOGGER_METHODS = %w[
122
+ << log add debug info warn error fatal unknown
123
+ level= sev_threshold= close
124
+ formatter formatter=
125
+ ] # :nodoc:
126
+ LOGGER_METHODS . each do |method |
127
+ class_eval <<-RUBY , __FILE__ , __LINE__ + 1
128
+ def #{ method } (...)
129
+ dispatch(:#{ method } , ...)
130
+ end
131
+ RUBY
160
132
end
161
133
162
- def close
163
- dispatch { |logger | logger . close }
134
+ # Returns the lowest level of all the loggers in the broadcast.
135
+ def level
136
+ @broadcasts . map ( &:level ) . min
164
137
end
165
138
166
139
# True if the log level allows entries with severity +Logger::DEBUG+ to be written
@@ -171,7 +144,7 @@ def debug?
171
144
172
145
# Sets the log level to +Logger::DEBUG+ for the whole broadcast.
173
146
def debug!
174
- dispatch { | logger | logger . debug! }
147
+ dispatch ( : debug!)
175
148
end
176
149
177
150
# True if the log level allows entries with severity +Logger::INFO+ to be written
@@ -182,7 +155,7 @@ def info?
182
155
183
156
# Sets the log level to +Logger::INFO+ for the whole broadcast.
184
157
def info!
185
- dispatch { | logger | logger . info! }
158
+ dispatch ( : info!)
186
159
end
187
160
188
161
# True if the log level allows entries with severity +Logger::WARN+ to be written
@@ -193,7 +166,7 @@ def warn?
193
166
194
167
# Sets the log level to +Logger::WARN+ for the whole broadcast.
195
168
def warn!
196
- dispatch { | logger | logger . warn! }
169
+ dispatch ( : warn!)
197
170
end
198
171
199
172
# True if the log level allows entries with severity +Logger::ERROR+ to be written
@@ -204,7 +177,7 @@ def error?
204
177
205
178
# Sets the log level to +Logger::ERROR+ for the whole broadcast.
206
179
def error!
207
- dispatch { | logger | logger . error! }
180
+ dispatch ( : error!)
208
181
end
209
182
210
183
# True if the log level allows entries with severity +Logger::FATAL+ to be written
@@ -215,21 +188,35 @@ def fatal?
215
188
216
189
# Sets the log level to +Logger::FATAL+ for the whole broadcast.
217
190
def fatal!
218
- dispatch { | logger | logger . fatal! }
191
+ dispatch ( : fatal!)
219
192
end
220
193
221
194
def initialize_copy ( other )
222
195
@broadcasts = [ ]
223
196
@progname = other . progname . dup
224
- @formatter = other . formatter . dup
225
197
226
198
broadcast_to ( *other . broadcasts . map ( &:dup ) )
227
199
end
228
200
229
201
private
230
- def dispatch ( &block )
231
- @broadcasts . each { |logger | block . call ( logger ) }
232
- true
202
+ def dispatch ( method , *args , **kwargs , &block )
203
+ if block_given?
204
+ # Maintain semantics that the first logger yields the block
205
+ # as normal, but subsequent loggers won't re-execute the block.
206
+ # Instead, the initial result is immediately returned.
207
+ called , result = false , nil
208
+ block = proc { |*args , **kwargs |
209
+ if called then result
210
+ else
211
+ called = true
212
+ result = yield ( *args , **kwargs )
213
+ end
214
+ }
215
+ end
216
+
217
+ @broadcasts . map { |logger |
218
+ logger . send ( method , *args , **kwargs , &block )
219
+ } . first
233
220
end
234
221
235
222
def method_missing ( name , ...)
0 commit comments