| Index: pkg/logging/lib/logging.dart
|
| diff --git a/pkg/logging/lib/logging.dart b/pkg/logging/lib/logging.dart
|
| index 89682fa5da3ee5b899e9233eaf4052ed857267fa..a72a52807df84cb9abfcd93a4917d8328784484d 100644
|
| --- a/pkg/logging/lib/logging.dart
|
| +++ b/pkg/logging/lib/logging.dart
|
| @@ -9,6 +9,10 @@
|
| */
|
| library logging;
|
|
|
| +import 'dart:async';
|
| +
|
| +import 'package:meta/meta.dart';
|
| +
|
| /**
|
| * Whether to allow fine-grain logging and configuration of loggers in a
|
| * hierarchy. When false, all logging is merged in the root logger.
|
| @@ -43,8 +47,11 @@ class Logger {
|
| /** Children in the hierarchy of loggers, indexed by their simple names. */
|
| Map<String, Logger> children;
|
|
|
| - /** Handlers used to process log entries in this logger. */
|
| - List<LoggerHandler> _handlers;
|
| + /** Controller used to notify when log entries are added to this logger. */
|
| + StreamController<LogRecord> _controller;
|
| +
|
| + // TODO(sigmund): remove together with the deprecated [on] API.
|
| + Map<LoggerHandler, StreamSubscription> _deprecatedSubscriptions;
|
|
|
| /**
|
| * Singleton constructor. Calling `new Logger(name)` will return the same
|
| @@ -109,38 +116,27 @@ class Logger {
|
| * by adding a [LoggerHandler] to an event from the event manager, for
|
| * instance:
|
| * logger.on.record.add((record) { ... });
|
| + *
|
| + * This API is Deprecated. Use [onRecord] instead.
|
| */
|
| + @deprecated
|
| LoggerEvents get on => new LoggerEvents(this);
|
|
|
| - /** Adds a handler to listen whenever a log record is added to this logger. */
|
| - void _addHandler(LoggerHandler handler) {
|
| - if (hierarchicalLoggingEnabled || parent == null) {
|
| - if (_handlers == null) {
|
| - _handlers = new List<LoggerHandler>();
|
| - }
|
| - _handlers.add(handler);
|
| - } else {
|
| - root._addHandler(handler);
|
| - }
|
| - }
|
| -
|
| - /** Remove a previously added handler. */
|
| - void _removeHandler(LoggerHandler handler) {
|
| - if (hierarchicalLoggingEnabled || parent == null) {
|
| - if (_handlers == null) return;
|
| - int index = _handlers.indexOf(handler);
|
| - if (index != -1) _handlers.removeRange(index, 1);
|
| - } else {
|
| - root._removeHandler(handler);
|
| - }
|
| - }
|
| + /**
|
| + * Returns an stream of messages added to this [Logger]. You can listen for
|
| + * messages using the standard stream APIs, for instance:
|
| + * logger.onRecord.listen((record) { ... });
|
| + */
|
| + Stream<LogRecord> get onRecord => _getStream();
|
|
|
| - /** Removes all handlers previously added to this logger. */
|
| - void _clearHandlers() {
|
| + void clearListeners() {
|
| if (hierarchicalLoggingEnabled || parent == null) {
|
| - _handlers = null;
|
| + if (_controller != null) {
|
| + _controller.close();
|
| + _controller = null;
|
| + }
|
| } else {
|
| - root._clearHandlers();
|
| + root.clearListeners();
|
| }
|
| }
|
|
|
| @@ -194,9 +190,41 @@ class Logger {
|
| /** Log message at level [Level.SHOUT]. */
|
| void shout(String message) => log(Level.SHOUT, message);
|
|
|
| + Stream<LogRecord> _getStream() {
|
| + if (hierarchicalLoggingEnabled || parent == null) {
|
| + if (_controller == null) {
|
| + _controller = new StreamController<LogRecord>.broadcast();
|
| + }
|
| + return _controller.stream;
|
| + } else {
|
| + return root._getStream();
|
| + }
|
| + }
|
| +
|
| + /** Adds a handler to listen whenever a log record is added to this logger. */
|
| + void _addHandler(LoggerHandler handler) {
|
| + if (_deprecatedSubscriptions == null) {
|
| + _deprecatedSubscriptions = new Map<LoggerHandler, StreamSubscription>();
|
| + }
|
| +
|
| + _deprecatedSubscriptions[handler] = onRecord.listen(handler);
|
| + }
|
| +
|
| + void _removeHandler(LoggerHandler handler) {
|
| + if (_deprecatedSubscriptions != null) {
|
| + var sub = _deprecatedSubscriptions.remove(handler);
|
| + if (sub != null) {
|
| + sub.cancel();
|
| + }
|
| + if (_deprecatedSubscriptions.isEmpty) {
|
| + _deprecatedSubscriptions = null;
|
| + }
|
| + }
|
| + }
|
| +
|
| void _publish(LogRecord record) {
|
| - if (_handlers != null) {
|
| - _handlers.forEach((h) => h(record));
|
| + if (_controller != null) {
|
| + _controller.add(record);
|
| }
|
| }
|
|
|
| @@ -231,7 +259,7 @@ class LoggerHandlerList {
|
|
|
| void add(LoggerHandler handler) => _logger._addHandler(handler);
|
| void remove(LoggerHandler handler) => _logger._removeHandler(handler);
|
| - void clear() => _logger._clearHandlers();
|
| + void clear() => _logger.clearListeners();
|
| }
|
|
|
|
|
|
|