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