Commit 022cb2d9 authored by Jason Simmons's avatar Jason Simmons Committed by GitHub

Do not buffer logs in the verbose logger (#6465)

With the old policy the most recent log would not be printed until the next
log is produced (which may be indefinitely).  This change prints logs
immediately along with a time delta since the previous log.
parent 379b1030
...@@ -206,9 +206,6 @@ Future<Null> _exit(int code) async { ...@@ -206,9 +206,6 @@ Future<Null> _exit(int code) async {
// Run shutdown hooks before flushing logs // Run shutdown hooks before flushing logs
await runShutdownHooks(); await runShutdownHooks();
// Write any buffered output.
logger.flush();
// Give the task / timer queue one cycle through before we hard exit. // Give the task / timer queue one cycle through before we hard exit.
Timer.run(() { Timer.run(() {
printTrace('exiting with code $code'); printTrace('exiting with code $code');
......
...@@ -34,9 +34,6 @@ abstract class Logger { ...@@ -34,9 +34,6 @@ abstract class Logger {
/// Start an indeterminate progress display. /// Start an indeterminate progress display.
Status startProgress(String message); Status startProgress(String message);
/// Flush any buffered output.
void flush() { }
} }
class Status { class Status {
...@@ -87,9 +84,6 @@ class StdoutLogger extends Logger { ...@@ -87,9 +84,6 @@ class StdoutLogger extends Logger {
return new Status(); return new Status();
} }
} }
@override
void flush() { }
} }
class BufferLogger extends Logger { class BufferLogger extends Logger {
...@@ -123,34 +117,31 @@ class BufferLogger extends Logger { ...@@ -123,34 +117,31 @@ class BufferLogger extends Logger {
printStatus(message); printStatus(message);
return new Status(); return new Status();
} }
@override
void flush() { }
} }
class VerboseLogger extends Logger { class VerboseLogger extends Logger {
_LogMessage lastMessage; Stopwatch stopwatch = new Stopwatch();
VerboseLogger() {
stopwatch.start();
}
@override @override
bool get isVerbose => true; bool get isVerbose => true;
@override @override
void printError(String message, [StackTrace stackTrace]) { void printError(String message, [StackTrace stackTrace]) {
_emit(); _emit(_LogType.error, message, stackTrace);
lastMessage = new _LogMessage(_LogType.error, message, stackTrace);
} }
@override @override
void printStatus(String message, { bool emphasis: false, bool newline: true }) { void printStatus(String message, { bool emphasis: false, bool newline: true }) {
// TODO(ianh): We ignore newline and emphasis here. _emit(_LogType.status, message);
_emit();
lastMessage = new _LogMessage(_LogType.status, message);
} }
@override @override
void printTrace(String message) { void printTrace(String message) {
_emit(); _emit(_LogType.trace, message);
lastMessage = new _LogMessage(_LogType.trace, message);
} }
@override @override
...@@ -159,40 +150,25 @@ class VerboseLogger extends Logger { ...@@ -159,40 +150,25 @@ class VerboseLogger extends Logger {
return new Status(); return new Status();
} }
@override void _emit(_LogType type, String message, [StackTrace stackTrace]) {
void flush() => _emit(); if (message.trim().isEmpty)
return;
void _emit() {
lastMessage?.emit();
lastMessage = null;
}
}
enum _LogType { int millis = stopwatch.elapsedMilliseconds;
error, stopwatch.reset();
status,
trace
}
class _LogMessage { String prefix;
_LogMessage(this.type, this.message, [this.stackTrace]) { const int prefixWidth = 8;
stopwatch.start(); if (millis == 0) {
prefix = ''.padLeft(prefixWidth);
} else {
prefix = '+$millis ms'.padLeft(prefixWidth);
if (millis >= 100)
prefix = terminal.writeBold(prefix);
} }
prefix = '[$prefix] ';
final _LogType type;
final String message;
final StackTrace stackTrace;
Stopwatch stopwatch = new Stopwatch();
void emit() {
stopwatch.stop();
int millis = stopwatch.elapsedMilliseconds;
String prefix = '${millis.toString().padLeft(4)} ms • ';
String indent = ''.padLeft(prefix.length); String indent = ''.padLeft(prefix.length);
if (millis >= 100)
prefix = terminal.writeBold(prefix.substring(0, prefix.length - 3)) + ' • ';
String indentMessage = message.replaceAll('\n', '\n$indent'); String indentMessage = message.replaceAll('\n', '\n$indent');
if (type == _LogType.error) { if (type == _LogType.error) {
...@@ -207,6 +183,12 @@ class _LogMessage { ...@@ -207,6 +183,12 @@ class _LogMessage {
} }
} }
enum _LogType {
error,
status,
trace
}
class AnsiTerminal { class AnsiTerminal {
AnsiTerminal() { AnsiTerminal() {
// TODO(devoncarew): This detection does not work for Windows. // TODO(devoncarew): This detection does not work for Windows.
......
...@@ -415,9 +415,6 @@ class DevFS { ...@@ -415,9 +415,6 @@ class DevFS {
await _operations.writeSource(fsName, '.packages', sb.toString()); await _operations.writeSource(fsName, '.packages', sb.toString());
printTrace('DevFS: Sync finished'); printTrace('DevFS: Sync finished');
// NB: You must call flush after a printTrace if you want to be printed
// immediately.
logger.flush();
} }
void _scanFile(String devicePath, FileSystemEntity file) { void _scanFile(String devicePath, FileSystemEntity file) {
......
...@@ -129,11 +129,7 @@ class FlutterCommandRunner extends CommandRunner { ...@@ -129,11 +129,7 @@ class FlutterCommandRunner extends CommandRunner {
if (args.length == 1 && args.first == 'build') if (args.length == 1 && args.first == 'build')
args = <String>['build', '-h']; args = <String>['build', '-h'];
return super.run(args).then((dynamic result) { return super.run(args);
return result;
}).whenComplete(() {
logger.flush();
});
} }
@override @override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment