Index: utils/pub/log.dart |
diff --git a/utils/pub/log.dart b/utils/pub/log.dart |
index 6ca1fe01cc8ffa17e5341195a92ef920df5e9349..029f72cf6e5693b8b35583b140d8af17866e8794 100644 |
--- a/utils/pub/log.dart |
+++ b/utils/pub/log.dart |
@@ -8,7 +8,7 @@ library log; |
import 'dart:io'; |
import 'io.dart'; |
-typedef LogFn(Level level, message); |
+typedef LogFn(Entry entry); |
final Map<Level, LogFn> _loggers = new Map<Level, LogFn>(); |
/// The list of recorded log messages. Will only be recorded if |
@@ -49,9 +49,9 @@ class Level { |
/// A single log entry. |
class Entry { |
final Level level; |
- final String message; |
+ final List<String> lines; |
- Entry(this.level, this.message); |
+ Entry(this.level, this.lines); |
} |
/// Logs [message] at [Level.ERROR]. |
@@ -73,12 +73,13 @@ void fine(message) => write(Level.FINE, message); |
void write(Level level, message) { |
if (_loggers.isEmpty) showNormal(); |
+ var lines = message.toString().split(NEWLINE_PATTERN); |
+ var entry = new Entry(level, lines); |
+ |
var logFn = _loggers[level]; |
- if (logFn != null) logFn(level, message); |
+ if (logFn != null) logFn(entry); |
- if (_transcript != null) { |
- _transcript.add(new Entry(level, '$message')); |
- } |
+ if (_transcript != null) _transcript.add(entry); |
} |
/// Logs an asynchronous IO operation. Logs [startMessage] before the operation |
@@ -154,7 +155,7 @@ void dumpTranscript() { |
stderr.writeString('---- Log transcript ----\n'); |
for (var entry in _transcript) { |
- _logToStderrWithLabel(entry.level, entry.message); |
+ _logToStderrWithLabel(entry); |
} |
stderr.writeString('---- End log transcript ----\n'); |
} |
@@ -188,31 +189,40 @@ void showAll() { |
} |
/// Log function that prints the message to stdout. |
-void _logToStdout(Level level, message) { |
- print('$message'); |
+void _logToStdout(Entry entry) { |
+ _logToStream(stdout, entry, showLabel: false); |
} |
/// Log function that prints the message to stdout with the level name. |
-void _logToStdoutWithLabel(Level level, message) { |
- print(_splitAndPrefix(level, message)); |
+void _logToStdoutWithLabel(Entry entry) { |
+ _logToStream(stdout, entry, showLabel: true); |
} |
/// Log function that prints the message to stderr. |
-void _logToStderr(Level level, message) { |
- stderr.writeString('$message\n'); |
+void _logToStderr(Entry entry) { |
+ _logToStream(stderr, entry, showLabel: false); |
} |
/// Log function that prints the message to stderr with the level name. |
-void _logToStderrWithLabel(Level level, message) { |
- stderr.writeString(_splitAndPrefix(level, message)); |
- stderr.writeString('\n'); |
-} |
- |
-/// Add the level prefix to the first line of [message] and prefix subsequent |
-/// lines with "|". |
-String _splitAndPrefix(Level level, message) { |
- // TODO(rnystrom): We're doing lots of splitting and joining in here. If that |
- // becomes a performance problem, we can optimize this to write directly to |
- // stdout/stderr a line at a time. |
- return "$level: ${Strings.join(message.toString().split('\n'), '\n | ')}"; |
+void _logToStderrWithLabel(Entry entry) { |
+ _logToStream(stderr, entry, showLabel: true); |
+} |
+ |
+void _logToStream(OutputStream stream, Entry entry, {bool showLabel}) { |
+ bool firstLine = true; |
+ for (var line in entry.lines) { |
+ if (showLabel) { |
+ if (firstLine) { |
+ stream.writeString(entry.level.name); |
+ stream.writeString(': '); |
+ } else { |
+ stream.writeString(' | '); |
+ } |
+ } |
+ |
+ stream.writeString(line); |
+ stream.writeString('\n'); |
+ |
+ firstLine = false; |
+ } |
} |