error.dart 2.15 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:io' show stderr;

/// Standard error thrown by Flutter Driver API.
class DriverError extends Error {
  DriverError(this.message, [this.originalError, this.originalStackTrace]);

  /// Human-readable error message.
  final String message;

  final dynamic originalError;
  final dynamic originalStackTrace;

18 19 20 21 22 23 24
  String toString() {
    return '''DriverError: $message
Original error: $originalError
Original stack trace:
$originalStackTrace
    ''';
  }
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
}

// Whether someone redirected the log messages somewhere.
bool _noLogSubscribers = true;

final StreamController<LogRecord> _logger =
    new StreamController<LogRecord>.broadcast(sync: true, onListen: () {
      _noLogSubscribers = false;
    });

void _log(LogLevel level, String loggerName, Object message) {
  LogRecord record = new LogRecord._(level, loggerName, '$message');
  // If nobody expressed interest in rerouting log messages somewhere specific,
  // print them to stderr.
  if (_noLogSubscribers)
    stderr.writeln(record);
  else
    _logger.add(record);
}

/// Emits log records from Flutter Driver.
final Stream<LogRecord> flutterDriverLog = _logger.stream;

/// Severity of a log entry.
enum LogLevel { trace, info, warning, error, critical }

/// A log entry.
class LogRecord {
  const LogRecord._(this.level, this.loggerName, this.message);

  final LogLevel level;
  final String loggerName;
  final String message;

  String toString() => '[${"$level".split(".").last}] $loggerName: $message';
}

/// Package-private; users should use other public logging libraries.
class Logger {
  Logger(this.name);

  final String name;

  void trace(Object message) {
    _log(LogLevel.trace, name, message);
  }

  void info(Object message) {
    _log(LogLevel.info, name, message);
  }

  void warning(Object message) {
    _log(LogLevel.warning, name, message);
  }

  void error(Object message) {
    _log(LogLevel.error, name, message);
  }

  void critical(Object message) {
    _log(LogLevel.critical, name, message);
  }
}