blob: 4fa5d25a183bc040f35c6b3e290e8e787ed0efaf [file] [log] [blame]
// Copyright (c) 2017, 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 'dart:io';
import 'package:path/path.dart' as path;
enum Level { debug, info, warning, error }
abstract class Logger {
Level level;
Logger(this.level);
void info(String msg, [error, StackTrace stackTrace]);
void warning(String msg, [error, StackTrace stackTrace]);
void error(String msg, [error, StackTrace stackTrace]);
void debug(String msg, [error, StackTrace stackTrace]);
void destroy();
}
String _formatMessage(String msg, error, [StackTrace stackTrace]) {
if (error == null) return msg;
if (stackTrace == null) return "$msg: $error";
return "$msg: $error\n$stackTrace";
}
class StdOutLogger extends Logger {
StdOutLogger(Level level) : super(level);
@override
void info(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.info, "$_datetime Info: $msg");
}
@override
void warning(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.warning, "$_datetime Warning: $msg");
}
@override
void error(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.error, "$_datetime Error: $msg");
}
@override
void debug(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.debug, "$_datetime Debug: $msg");
}
void _print(Level logLevel, String msg) {
if (logLevel.index >= level.index) {
print(msg);
}
}
@override
void destroy() {
// nothing to do
}
String get _datetime => "${new DateTime.now()}";
}
class FileLogger extends Logger {
IOSink _sink;
FileLogger(String fileName, Level level, {bool append: false})
: super(level) {
var mode = append ? FileMode.APPEND : FileMode.WRITE;
_sink = new File(path.absolute(fileName)).openWrite(mode: mode);
}
@override
void destroy() {
if (_sink != null) {
_sink.close();
_sink = null;
}
}
@override
void info(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.info, "$_datetime Info: $msg");
}
@override
void warning(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.warning, "$_datetime Warning: $msg");
}
@override
void error(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.error, "$_datetime Error: $msg");
}
@override
void debug(String msg, [error, stackTrace]) {
msg = _formatMessage(msg, error, stackTrace);
_print(Level.debug, "$_datetime Debug: $msg");
}
void _print(Level logLevel, String msg) {
if (logLevel.index >= level.index && _sink != null) _sink.writeln(msg);
}
static String get _datetime => "${new DateTime.now()}";
}