1 module gfm.logger.log;
2 
3 import std.stream,
4        std..string;
5 
6 static if( __VERSION__ >= 2067 )
7     import std.experimental.logger;
8 else
9     import std.historical.logger;
10 
11 import colorize;
12 
13 /// Coloured console logger.
14 class ConsoleLogger : Logger
15 {
16     public
17     {
18         this()
19         {
20             super(LogLevel.info);
21         }
22 
23         override protected void writeLogMsg(ref LogEntry payload) @trusted
24         {
25             LogLevel logLevel;
26 
27             auto foregroundColor = fg.white;
28             switch(payload.logLevel)
29             {
30                 case LogLevel.info:
31                     foregroundColor = fg.light_white;
32                     break;
33 
34                 case LogLevel.warning:
35                     foregroundColor = fg.light_yellow;
36                     break;
37 
38                 case LogLevel.error:
39                 case LogLevel.critical:
40                 case LogLevel.fatal:
41                     foregroundColor = fg.light_red;
42                     break;
43 
44                 case LogLevel.trace:
45                 default:
46                     foregroundColor = fg.white;
47             }
48 
49             import colorize.cwrite;
50             cwritefln( color("%s: %s", foregroundColor), logLevelToString(payload.logLevel), payload.msg);
51         }
52 
53         ~this()
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 }