blob: ebb4d31ebeee8e2a10917dcb6a1bb85aef692e5c [file] [log] [blame]
// Copyright 2013 The Flutter 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:io';
/// Defines the available log levels.
class LogLevel {
const LogLevel._(this._level,;
final int _level;
/// String name for the log level.
final String name;
/// LogLevel for messages instended for debugging.
static const LogLevel debug = LogLevel._(0, 'DEBUG');
/// LogLevel for messages instended to provide information about the
/// execution.
static const LogLevel info = LogLevel._(1, 'INFO');
/// LogLevel for messages instended to flag potential problems.
static const LogLevel warning = LogLevel._(2, 'WARN');
/// LogLevel for errors in the execution.
static const LogLevel error = LogLevel._(3, 'ERROR');
/// Abstract class for loggers.
abstract class Logger {
/// Processes a debug message.
void debug(Object message);
/// Processes an info message.
void info(Object message);
/// Processes a warning message.
void warning(Object message);
/// Processes an error message.
void error(Object message);
/// Logger to print message to standard output.
class PrintLogger implements Logger {
/// Creates a logger instance to print messages to standard output.
IOSink out,
bool prependLogData,
this.level =,
}) : out = out ?? stdout,
prependLogData = prependLogData ?? true;
/// The [IOSink] to print to.
final IOSink out;
/// Available log levels.
final LogLevel level;
/// Wether to prepend datetime and log level or not.
final bool prependLogData;
/// Stdout buffer.
final StringBuffer stdoutBuffer = StringBuffer();
/// Stderr buffer.
final StringBuffer stderrBuffer = StringBuffer();
/// Returns all the content logged as info, debug and warning without the
/// datetime and log level prepended to lines.
String outputLog() {
return stdoutBuffer.toString();
/// Returns all the content logged error without the
/// datetime and log level prepended to lines.
String errorLog() {
return stderrBuffer.toString();
void debug(Object message) {
_log(LogLevel.debug, message);
void info(Object message) {
_log(, message);
void warning(Object message) {
_log(LogLevel.warning, message);
void error(Object message) {
_log(LogLevel.error, message);
void _log(LogLevel level, Object message) {
if (prependLogData) {
if (level._level >= this.level._level) {
out.writeln(toLogString('$message', level: level));
} else {
/// Flushes the IOSink to ensure all the data is written. This is specially
/// useful when writing to a file.
Future<void> flush() async {
await out.flush();
/// Transforms a [message] with [level] to a string that contains the DateTime,
/// level and message.
String toLogString(String message, {LogLevel level}) {
final StringBuffer buffer = StringBuffer();
buffer.write(': ');
if (level != null) {
buffer.write(' ');
return buffer.toString();