| // 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()}"; |
| } |