Chromium Code Reviews| Index: tools/gardening_tools/base_lib/lib/src/logger.dart |
| diff --git a/tools/gardening_tools/base_lib/lib/src/logger.dart b/tools/gardening_tools/base_lib/lib/src/logger.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f40ddfac6d0fca44c2b56436ee56feff031f0945 |
| --- /dev/null |
| +++ b/tools/gardening_tools/base_lib/lib/src/logger.dart |
| @@ -0,0 +1,112 @@ |
| +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]); |
| + void warning(String msg, [Error, StackTrace]); |
| + void error(String msg, [Error, StackTrace]); |
| + void debug(String msg, [Error, StackTrace]); |
| + |
| + void destroy(); |
| +} |
| + |
| +String _formatErrorMessage(String msg, Exception error, StackTrace stackTrace) { |
| + if (error == null) return msg; |
| + msg += ": $error\n$stackTrace"; |
|
Johnni Winther
2017/08/23 12:40:47
Support nice printing of an error without a stack
|
| + return msg; |
| +} |
| + |
| +class StdOutLogger extends Logger { |
| + StdOutLogger(Level level) : super(level); |
| + |
| + @override |
| + void info(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.info, "$_datetime Info: $msg"); |
| + } |
| + |
| + @override |
| + void warning(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.warning, "$_datetime Warning: $msg"); |
| + } |
| + |
| + @override |
| + void error(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.error, "$_datetime Error: $msg"); |
| + } |
| + |
| + @override |
| + void debug(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(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 = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.info, "$_datetime Info: $msg"); |
| + } |
| + |
| + @override |
| + void warning(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.warning, "$_datetime Warning: $msg"); |
| + } |
| + |
| + @override |
| + void error(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(msg, error, stackTrace); |
| + _print(Level.error, "$_datetime Error: $msg"); |
| + } |
| + |
| + @override |
| + void debug(String msg, [error, stackTrace]) { |
| + msg = _formatErrorMessage(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()}"; |
| +} |