Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Side by Side Diff: pkg/logging/lib/logging.dart

Issue 12334093: pkg/logging: BREAKING: move to stream-based event model (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: keep old API, but deprecated Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/logging/test/logging_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/logging/test/logging_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698