Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions webdev/lib/src/logging.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import 'package:logging/logging.dart';

var _verbose = false;

var _loggerName = RegExp(r'^\w+: ');

/// Sets the verbosity of the current [logHandler].
void setVerbosity(bool verbose) => _verbose = verbose;

Expand Down Expand Up @@ -39,6 +41,7 @@ void _colorLog(Level level, String message, {bool verbose}) {
var multiline = message.contains('\n') && !message.endsWith('\n');
var eraseLine = _verbose ? '' : '\x1b[2K\r';
var colorLevel = color.wrap('[$level]');
if (!verbose) message = trimLoggerName(message);

stdout.write('$eraseLine$colorLevel $message');

Expand All @@ -53,6 +56,14 @@ String trimLevel(Level level, String message) => message.startsWith('[$level]')
? message.replaceFirst('[$level]', '').trimLeft()
: message;

/// Removes the logger name from the [message] if one is present.
String trimLoggerName(String message) {
var match = _loggerName.firstMatch(message);
// Remove the logger name.
if (match != null) message = message.substring(match.end);
return message;
}

/// Detects if the [ServerLog] contains a [Level] and returns the
/// resulting value.
///
Expand Down
65 changes: 65 additions & 0 deletions webdev/test/logging_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:build_daemon/data/server_log.dart';
import 'package:logging/logging.dart';
import 'package:test/test.dart';
import 'package:webdev/src/logging.dart';

void main() {
group('trimLoggerName', () {
test('properly removes logger names', () {
expect(trimLoggerName('SomeLogName: foo bar'), equals('foo bar'));
});

test('leaves messages untouched if no logger name is present', () {
expect(trimLoggerName('foo bar looksLikeALoggerName: '),
equals('foo bar looksLikeALoggerName: '));
});

test('works with empty messages', () {
expect(trimLoggerName(''), equals(''));
});

test('assumes logger names is one word', () {
expect(trimLoggerName('not a logger: foo bar'),
equals('not a logger: foo bar'));
expect(trimLoggerName('foo baz: foo bar'), equals('foo baz: foo bar'));
});

test('assumes loggers are directly at the front of a message', () {
expect(
trimLoggerName(' notLogger: foo bar'), equals(' notLogger: foo bar'));
});
});

group('levelForLog', () {
test('correctly returns the level from the log', () {
expect(levelForLog(ServerLog((b) => b.log = '[INFO] foo bar')),
equals(Level.INFO));
expect(levelForLog(ServerLog((b) => b.log = '[SEVERE] foo bar')),
equals(Level.SEVERE));
});

test('returns null if no level is present', () {
expect(levelForLog(ServerLog((b) => b.log = 'foo bar')), isNull);
});

test('only looks for levels at the start of a log', () {
expect(levelForLog(ServerLog((b) => b.log = 'foo bar [INFO]')), isNull);
});
});

group('trimLevel', () {
test('correctly trims the level from the message', () {
expect(trimLevel(Level.INFO, '[INFO]foo bar'), equals('foo bar'));
expect(trimLevel(Level.INFO, '[INFO]no space'), equals('no space'));
});

test('leaves the message untouched if the level is not present', () {
expect(trimLevel(Level.INFO, '[SEVERE] foo bar'),
equals('[SEVERE] foo bar'));
});
});
}