Chromium Code Reviews| 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 |