1 module gfm.core.log;
2 
3 import std.stream,
4        std..string;
5 
6 import std.experimental.logger;
7 import colorize;
8 
9 // Because default std.logger logger is a bit verbose, and lacks colors.
10 class ConsoleLogger : Logger
11 {
12     public
13     {
14         this()
15         {
16             super(LogLevel.info);
17         }
18 
19         override protected void writeLogMsg(ref LogEntry payload) @trusted
20         {
21             LogLevel logLevel;
22             
23             auto foregroundColor = fg.white;
24             switch(payload.logLevel)
25             {
26                 case LogLevel.info:
27                     foregroundColor = fg.light_white;
28                     break;
29 
30                 case LogLevel.warning:
31                     foregroundColor = fg.light_yellow;
32                     break;
33 
34                 case LogLevel.error:
35                 case LogLevel.critical:
36                 case LogLevel.fatal:
37                     foregroundColor = fg.light_red;
38                     break;
39 
40                 case LogLevel.trace:
41                 default:
42                     foregroundColor = fg.white;
43             }
44 
45             import colorize.cwrite;
46             cwritefln( color("%s: %s", foregroundColor), logLevelToString(payload.logLevel), payload.msg);
47         }
48 
49         ~this()
50         {
51         }
52 
53         deprecated("No need to call close() on ConsoleLogger anymore") void close()
54         {
55         }
56     }
57 
58     private
59     {
60         static pure string logLevelToString(const LogLevel lv)
61         {
62             switch(lv)
63             {
64                 case LogLevel.trace:
65                     return "trace";
66                 case LogLevel.info:
67                     return "info";
68                 case LogLevel.warning:
69                     return "warning";
70                 case LogLevel.error:
71                     return "error";
72                 case LogLevel.critical:
73                     return "critical";
74                 case LogLevel.fatal:
75                     return "fatal";
76                 default:
77                     assert(false);
78             }
79         }
80     }
81 }