1 module gfm.core.log;
2 
3 import std.stream,
4        std.string;
5 
6 import std.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 void writeLogMsg(ref LoggerPayload payload) @trusted
20         {
21             LogLevel logLevel;
22             
23             synchronized(this)
24             {
25                 auto foregroundColor = fg.white;
26                 switch(payload.logLevel)
27                 {
28                     case LogLevel.info:
29                         foregroundColor = fg.light_white;
30                         break;
31 
32                     case LogLevel.warning:
33                         foregroundColor = fg.light_yellow;
34                         break;
35 
36                     case LogLevel.error:
37                     case LogLevel.critical:
38                     case LogLevel.fatal:
39                         foregroundColor = fg.light_red;
40                         break;
41 
42                     case LogLevel.unspecific:
43                     case LogLevel.trace:
44                     default:
45                         foregroundColor = fg.white;
46                 }
47 
48                 import colorize.cwrite;
49                 cwritefln( color("%s: %s", foregroundColor), logLevelToString(payload.logLevel), payload.msg);
50             }
51         }
52 
53         ~this()
54         {
55         }
56 
57         deprecated("No need to call close() on ConsoleLogger anymore") void close()
58         {
59         }
60     }
61 
62     private
63     {
64         static pure string logLevelToString(const LogLevel lv)
65         {
66             switch(lv)
67             {
68                 case LogLevel.unspecific:
69                     return "";
70                 case LogLevel.trace:
71                     return "trace";
72                 case LogLevel.info:
73                     return "info";
74                 case LogLevel.warning:
75                     return "warning";
76                 case LogLevel.error:
77                     return "error";
78                 case LogLevel.critical:
79                     return "critical";
80                 case LogLevel.fatal:
81                     return "fatal";
82                 default:
83                     assert(false);
84             }
85         }
86     }
87 }