1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
// 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;
String toString() {
return '''DriverError: $message
Original error: $originalError
Original stack trace:
$originalStackTrace
''';
}
}
// 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);
}
}