OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Provides APIs for debugging and error logging. This library introduces | 6 * Provides APIs for debugging and error logging. This library introduces |
7 * abstractions similar to those used in other languages, such as the Closure JS | 7 * abstractions similar to those used in other languages, such as the Closure JS |
8 * Logger and java.util.logging.Logger. | 8 * Logger and java.util.logging.Logger. |
9 */ | 9 */ |
10 library logging; | 10 library logging; |
11 | 11 |
12 import 'dart:async'; | |
13 | |
14 import 'package:meta/meta.dart'; | |
15 | |
12 /** | 16 /** |
13 * Whether to allow fine-grain logging and configuration of loggers in a | 17 * Whether to allow fine-grain logging and configuration of loggers in a |
14 * hierarchy. When false, all logging is merged in the root logger. | 18 * hierarchy. When false, all logging is merged in the root logger. |
15 */ | 19 */ |
16 bool hierarchicalLoggingEnabled = false; | 20 bool hierarchicalLoggingEnabled = false; |
17 | 21 |
18 /** | 22 /** |
19 * Level for the root-logger. This will be the level of all loggers if | 23 * Level for the root-logger. This will be the level of all loggers if |
20 * [hierarchicalLoggingEnabled] is false. | 24 * [hierarchicalLoggingEnabled] is false. |
21 */ | 25 */ |
(...skipping 14 matching lines...) Expand all Loading... | |
36 | 40 |
37 /** Parent of this logger in the hierarchy of loggers. */ | 41 /** Parent of this logger in the hierarchy of loggers. */ |
38 final Logger parent; | 42 final Logger parent; |
39 | 43 |
40 /** Logging [Level] used for entries generated on this logger. */ | 44 /** Logging [Level] used for entries generated on this logger. */ |
41 Level _level; | 45 Level _level; |
42 | 46 |
43 /** Children in the hierarchy of loggers, indexed by their simple names. */ | 47 /** Children in the hierarchy of loggers, indexed by their simple names. */ |
44 Map<String, Logger> children; | 48 Map<String, Logger> children; |
45 | 49 |
46 /** Handlers used to process log entries in this logger. */ | 50 /** Handlers used to process log entries in this logger. */ |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
fix comment
| |
47 List<LoggerHandler> _handlers; | 51 StreamController<LogRecord> _controller; |
52 | |
53 @deprecated | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
If you don't mind - let's remove this one here. We
| |
54 Map<LoggerHandler, StreamSubscription> _deprecatedSubscriptions; | |
48 | 55 |
49 /** | 56 /** |
50 * Singleton constructor. Calling `new Logger(name)` will return the same | 57 * Singleton constructor. Calling `new Logger(name)` will return the same |
51 * actual instance whenever it is called with the same string name. | 58 * actual instance whenever it is called with the same string name. |
52 */ | 59 */ |
53 factory Logger(String name) { | 60 factory Logger(String name) { |
54 if (name.startsWith('.')) { | 61 if (name.startsWith('.')) { |
55 throw new ArgumentError("name shouldn't start with a '.'"); | 62 throw new ArgumentError("name shouldn't start with a '.'"); |
56 } | 63 } |
57 if (_loggers == null) _loggers = <String, Logger>{}; | 64 if (_loggers == null) _loggers = <String, Logger>{}; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
101 'change the level on a non-root logger.'); | 108 'change the level on a non-root logger.'); |
102 } | 109 } |
103 _rootLevel = value; | 110 _rootLevel = value; |
104 } | 111 } |
105 } | 112 } |
106 | 113 |
107 /** | 114 /** |
108 * Returns an event manager for this [Logger]. You can listen for log messages | 115 * Returns an event manager for this [Logger]. You can listen for log messages |
109 * by adding a [LoggerHandler] to an event from the event manager, for | 116 * by adding a [LoggerHandler] to an event from the event manager, for |
110 * instance: | 117 * instance: |
111 * logger.on.record.add((record) { ... }); | 118 * logger.on.record.add((record) { ... }); |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
+ let's add a small comment here, like:
Deprecate
| |
112 */ | 119 */ |
120 @deprecated | |
113 LoggerEvents get on => new LoggerEvents(this); | 121 LoggerEvents get on => new LoggerEvents(this); |
114 | 122 |
115 /** Adds a handler to listen whenever a log record is added to this logger. */ | 123 Stream<LogRecord> get onRecord => _getStream(); |
116 void _addHandler(LoggerHandler handler) { | 124 |
117 if (hierarchicalLoggingEnabled || parent == null) { | 125 void clearListeners() { |
118 if (_handlers == null) { | 126 if(hierarchicalLoggingEnabled || parent == null) { |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
style: add space after 'if' (same here below)
| |
119 _handlers = new List<LoggerHandler>(); | 127 if(_controller != null) { |
128 _controller.close(); | |
129 _controller = null; | |
120 } | 130 } |
121 _handlers.add(handler); | |
122 } else { | 131 } else { |
123 root._addHandler(handler); | 132 root.clearListeners(); |
124 } | 133 } |
125 } | 134 } |
126 | 135 |
127 /** Remove a previously added handler. */ | |
128 void _removeHandler(LoggerHandler handler) { | |
129 if (hierarchicalLoggingEnabled || parent == null) { | |
130 if (_handlers == null) return; | |
131 int index = _handlers.indexOf(handler); | |
132 if (index != -1) _handlers.removeRange(index, 1); | |
133 } else { | |
134 root._removeHandler(handler); | |
135 } | |
136 } | |
137 | |
138 /** Removes all handlers previously added to this logger. */ | |
139 void _clearHandlers() { | |
140 if (hierarchicalLoggingEnabled || parent == null) { | |
141 _handlers = null; | |
142 } else { | |
143 root._clearHandlers(); | |
144 } | |
145 } | |
146 | |
147 /** Whether a message for [value]'s level is loggable in this logger. */ | 136 /** Whether a message for [value]'s level is loggable in this logger. */ |
148 bool isLoggable(Level value) => (value >= level); | 137 bool isLoggable(Level value) => (value >= level); |
149 | 138 |
150 /** | 139 /** |
151 * Adds a log record for a [message] at a particular [logLevel] if | 140 * Adds a log record for a [message] at a particular [logLevel] if |
152 * `isLoggable(logLevel)` is true. Use this method to create log entries for | 141 * `isLoggable(logLevel)` is true. Use this method to create log entries for |
153 * user-defined levels. To record a message at a predefined level (e.g. | 142 * user-defined levels. To record a message at a predefined level (e.g. |
154 * [Level.INFO], [Level.WARNING], etc) you can use their specialized methods | 143 * [Level.INFO], [Level.WARNING], etc) you can use their specialized methods |
155 * instead (e.g. [info], [warning], etc). | 144 * instead (e.g. [info], [warning], etc). |
156 */ | 145 */ |
(...skipping 30 matching lines...) Expand all Loading... | |
187 | 176 |
188 /** Log message at level [Level.WARNING]. */ | 177 /** Log message at level [Level.WARNING]. */ |
189 void warning(String message) => log(Level.WARNING, message); | 178 void warning(String message) => log(Level.WARNING, message); |
190 | 179 |
191 /** Log message at level [Level.SEVERE]. */ | 180 /** Log message at level [Level.SEVERE]. */ |
192 void severe(String message) => log(Level.SEVERE, message); | 181 void severe(String message) => log(Level.SEVERE, message); |
193 | 182 |
194 /** Log message at level [Level.SHOUT]. */ | 183 /** Log message at level [Level.SHOUT]. */ |
195 void shout(String message) => log(Level.SHOUT, message); | 184 void shout(String message) => log(Level.SHOUT, message); |
196 | 185 |
197 void _publish(LogRecord record) { | 186 /** Adds a handler to listen whenever a log record is added to this logger. */ |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
move this comment down to _addHandler?
| |
198 if (_handlers != null) { | 187 Stream<LogRecord> _getStream() { |
199 _handlers.forEach((h) => h(record)); | 188 if (hierarchicalLoggingEnabled || parent == null) { |
189 if (_controller == null) { | |
190 _controller = new StreamController<LogRecord>.broadcast(); | |
191 } | |
192 return _controller.stream; | |
193 } else { | |
194 return root._getStream(); | |
200 } | 195 } |
201 } | 196 } |
202 | 197 |
198 @deprecated | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
same here and all the ones below (the user had to
| |
199 void _addHandler(LoggerHandler handler) { | |
200 if(_deprecatedSubscriptions == null) { | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
style: missing space after 'if'
| |
201 _deprecatedSubscriptions = new Map<LoggerHandler, StreamSubscription>(); | |
202 } | |
203 | |
204 final sub = onRecord.listen(handler); | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
style: even thought it's final, we use 'var' for t
| |
205 _deprecatedSubscriptions[handler] = sub; | |
206 } | |
207 | |
208 @deprecated | |
209 void _removeHandler(LoggerHandler handler) { | |
210 if(_deprecatedSubscriptions != null) { | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
style: space after if (same below)
| |
211 final sub = _deprecatedSubscriptions.remove(handler); | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
style: final -> var
| |
212 if(sub != null) { | |
213 sub.cancel(); | |
214 } | |
215 if(_deprecatedSubscriptions.isEmpty) { | |
216 _deprecatedSubscriptions = null; | |
217 } | |
218 } | |
219 } | |
220 | |
221 void _publish(LogRecord record) { | |
222 if (_controller != null) { | |
223 _controller.add(record); | |
224 } | |
225 } | |
226 | |
203 /** Top-level root [Logger]. */ | 227 /** Top-level root [Logger]. */ |
204 static get root => new Logger(''); | 228 static get root => new Logger(''); |
205 | 229 |
206 /** All [Logger]s in the system. */ | 230 /** All [Logger]s in the system. */ |
207 static Map<String, Logger> _loggers; | 231 static Map<String, Logger> _loggers; |
208 } | 232 } |
209 | 233 |
210 | 234 |
211 /** Handler callback to process log entries as they are added to a [Logger]. */ | 235 /** Handler callback to process log entries as they are added to a [Logger]. */ |
236 @deprecated | |
212 typedef void LoggerHandler(LogRecord); | 237 typedef void LoggerHandler(LogRecord); |
213 | 238 |
214 | 239 |
215 /** Event manager for a [Logger] (holds events that a [Logger] can fire). */ | 240 /** Event manager for a [Logger] (holds events that a [Logger] can fire). */ |
241 @deprecated | |
216 class LoggerEvents { | 242 class LoggerEvents { |
217 final Logger _logger; | 243 final Logger _logger; |
218 | 244 |
219 LoggerEvents(this._logger); | 245 LoggerEvents(this._logger); |
220 | 246 |
221 /** Event fired when a log record is added to a [Logger]. */ | 247 /** Event fired when a log record is added to a [Logger]. */ |
222 LoggerHandlerList get record => new LoggerHandlerList(_logger); | 248 LoggerHandlerList get record => new LoggerHandlerList(_logger); |
223 } | 249 } |
224 | 250 |
225 | 251 |
226 /** List of handlers that will be called on a logger event. */ | 252 /** List of handlers that will be called on a logger event. */ |
253 @deprecated | |
Siggi Cherem (dart-lang)
2013/02/26 21:11:24
I doubt anyone will allocate these types directly
| |
227 class LoggerHandlerList { | 254 class LoggerHandlerList { |
228 Logger _logger; | 255 Logger _logger; |
229 | 256 |
230 LoggerHandlerList(this._logger); | 257 LoggerHandlerList(this._logger); |
231 | 258 |
232 void add(LoggerHandler handler) => _logger._addHandler(handler); | 259 void add(LoggerHandler handler) => _logger._addHandler(handler); |
233 void remove(LoggerHandler handler) => _logger._removeHandler(handler); | 260 void remove(LoggerHandler handler) => _logger._removeHandler(handler); |
234 void clear() => _logger._clearHandlers(); | 261 void clear() => _logger.clearListeners(); |
235 } | 262 } |
236 | 263 |
237 | 264 |
238 /** | 265 /** |
239 * [Level]s to control logging output. Logging can be enabled to include all | 266 * [Level]s to control logging output. Logging can be enabled to include all |
240 * levels above certain [Level]. [Level]s are ordered using an integer | 267 * levels above certain [Level]. [Level]s are ordered using an integer |
241 * value [Level.value]. The predefined [Level] constants below are sorted as | 268 * value [Level.value]. The predefined [Level] constants below are sorted as |
242 * follows (in descending order): [Level.SHOUT], [Level.SEVERE], | 269 * follows (in descending order): [Level.SHOUT], [Level.SEVERE], |
243 * [Level.WARNING], [Level.INFO], [Level.CONFIG], [Level.FINE], [Level.FINER], | 270 * [Level.WARNING], [Level.INFO], [Level.CONFIG], [Level.FINE], [Level.FINER], |
244 * [Level.FINEST], and [Level.ALL]. | 271 * [Level.FINEST], and [Level.ALL]. |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
325 | 352 |
326 /** Associated exception message (if any) when recording errors messages. */ | 353 /** Associated exception message (if any) when recording errors messages. */ |
327 String exceptionText; | 354 String exceptionText; |
328 | 355 |
329 LogRecord( | 356 LogRecord( |
330 this.level, this.message, this.loggerName, | 357 this.level, this.message, this.loggerName, |
331 [time, this.exception, this.exceptionText]) : | 358 [time, this.exception, this.exceptionText]) : |
332 this.time = (time == null) ? new DateTime.now() : time, | 359 this.time = (time == null) ? new DateTime.now() : time, |
333 this.sequenceNumber = LogRecord._nextNumber++; | 360 this.sequenceNumber = LogRecord._nextNumber++; |
334 } | 361 } |
OLD | NEW |