OLD | NEW |
---|---|
(Empty) | |
1 import 'dart:io'; | |
2 import 'package:path/path.dart' as path; | |
3 | |
4 enum Level { debug, info, warning, error } | |
5 | |
6 abstract class Logger { | |
7 Level level; | |
8 | |
9 Logger(this.level); | |
10 | |
11 void info(String msg, [Error, StackTrace]); | |
12 void warning(String msg, [Error, StackTrace]); | |
13 void error(String msg, [Error, StackTrace]); | |
14 void debug(String msg, [Error, StackTrace]); | |
15 | |
16 void destroy(); | |
17 } | |
18 | |
19 String _formatErrorMessage(String msg, Exception error, StackTrace stackTrace) { | |
20 if (error == null) return msg; | |
21 msg += ": $error\n$stackTrace"; | |
Johnni Winther
2017/08/23 12:40:47
Support nice printing of an error without a stack
| |
22 return msg; | |
23 } | |
24 | |
25 class StdOutLogger extends Logger { | |
26 StdOutLogger(Level level) : super(level); | |
27 | |
28 @override | |
29 void info(String msg, [error, stackTrace]) { | |
30 msg = _formatErrorMessage(msg, error, stackTrace); | |
31 _print(Level.info, "$_datetime Info: $msg"); | |
32 } | |
33 | |
34 @override | |
35 void warning(String msg, [error, stackTrace]) { | |
36 msg = _formatErrorMessage(msg, error, stackTrace); | |
37 _print(Level.warning, "$_datetime Warning: $msg"); | |
38 } | |
39 | |
40 @override | |
41 void error(String msg, [error, stackTrace]) { | |
42 msg = _formatErrorMessage(msg, error, stackTrace); | |
43 _print(Level.error, "$_datetime Error: $msg"); | |
44 } | |
45 | |
46 @override | |
47 void debug(String msg, [error, stackTrace]) { | |
48 msg = _formatErrorMessage(msg, error, stackTrace); | |
49 _print(Level.debug, "$_datetime Debug: $msg"); | |
50 } | |
51 | |
52 void _print(Level logLevel, String msg) { | |
53 if (logLevel.index >= level.index) { | |
54 print(msg); | |
55 } | |
56 } | |
57 | |
58 @override | |
59 void destroy() { | |
60 // nothing to do | |
61 } | |
62 | |
63 String get _datetime => "${new DateTime.now()}"; | |
64 } | |
65 | |
66 class FileLogger extends Logger { | |
67 IOSink _sink; | |
68 | |
69 FileLogger(String fileName, Level level, {bool append: false}) | |
70 : super(level) { | |
71 var mode = append ? FileMode.APPEND : FileMode.WRITE; | |
72 _sink = new File(path.absolute(fileName)).openWrite(mode: mode); | |
73 } | |
74 | |
75 @override | |
76 void destroy() { | |
77 if (_sink != null) { | |
78 _sink.close(); | |
79 _sink = null; | |
80 } | |
81 } | |
82 | |
83 @override | |
84 void info(String msg, [error, stackTrace]) { | |
85 msg = _formatErrorMessage(msg, error, stackTrace); | |
86 _print(Level.info, "$_datetime Info: $msg"); | |
87 } | |
88 | |
89 @override | |
90 void warning(String msg, [error, stackTrace]) { | |
91 msg = _formatErrorMessage(msg, error, stackTrace); | |
92 _print(Level.warning, "$_datetime Warning: $msg"); | |
93 } | |
94 | |
95 @override | |
96 void error(String msg, [error, stackTrace]) { | |
97 msg = _formatErrorMessage(msg, error, stackTrace); | |
98 _print(Level.error, "$_datetime Error: $msg"); | |
99 } | |
100 | |
101 @override | |
102 void debug(String msg, [error, stackTrace]) { | |
103 msg = _formatErrorMessage(msg, error, stackTrace); | |
104 _print(Level.debug, "$_datetime Debug: $msg"); | |
105 } | |
106 | |
107 void _print(Level logLevel, String msg) { | |
108 if (logLevel.index >= level.index && _sink != null) _sink.writeln(msg); | |
109 } | |
110 | |
111 static String get _datetime => "${new DateTime.now()}"; | |
112 } | |
OLD | NEW |