1 module logger.consolelogger;
2 
3 import std.experimental.logger;
4 import logger.extendedfilelogger;
5 
6 /**
7  * A simple color mapping that sets:
8  *
9  * - all : White tint, black background
10  * - trace : White tint, black background
11  * - info : Green tint, black background
12  * - warning : Yellow tint, black background
13  * - error : Red tint, black background
14  * - critical : Underline bright red tint, black background
15  * - fatal : Black tint, bright red background
16  */
17 enum string[LogLevel] defaultColorMap = [
18     LogLevel.all:       "\033[37;40m",
19     LogLevel.trace:     "\033[37;40m",
20     LogLevel.info:      "\033[32;40m",
21     LogLevel.warning:   "\033[33;40m",
22     LogLevel.error:     "\033[31;40m",
23     LogLevel.critical:  "\033[4;91;40m",
24     LogLevel.fatal:     "\033[30;101m"
25 ];
26 
27 /**
28  * ConfigurableLogPattern that colorizes log level with ANSI escape codes
29  */
30 class ConfigurableAnsiLogPattern : ConfigurableLogPattern
31 {
32     private const string[LogLevel] colorMap;
33 
34     /**
35      * Builds a configurable log pattern
36      * Params:
37      *  colorMap = An dicctionary mapping loglevel to ANSI escape code. By default uses `defaultColorMap`
38      *  logPattern = String pattern to apply. By default uses `simplePattern`
39      */
40     this(const string[LogLevel] colorMap = defaultColorMap, string logPattern = simplePattern)
41     {
42         super(logPattern);
43         this.colorMap = colorMap;
44     }
45 
46     /// string preceding loglevel. Usefull to colorize it, with ANSI
47     override
48     protected string logLevelPrefix(const LogLevel logLevel) {
49         return this.colorMap.get(logLevel, "");
50     }
51 
52     /// string following loglevel. Usefull to colorize it, with ANSI
53     override
54     protected string logLevelPostfix(const LogLevel logLevel) {
55         return "\033[0m";
56     }  
57 }
58 
59 /// Extends PatternFileLogger to log only to stdout and to use by default ConfigurableAnsiLogPattern
60 class ConsoleLogger : ExtendedFileLogger
61 {
62     /**
63      * A constructor for the `FileLogger` Logger.
64      * Params:
65      *  lv = The `LogLevel` for the `FileLogger`. By default is LogLevel.all
66      *  logPattern = An implementation of the `ILogPattern`. By default uses ConfigurableAnsiLogPattern.
67     Example:
68     -------------
69     auto l1 = new ConsoleLogger();
70     auto l2 = new ConsoleLogger(LogLevel.fatal);
71     auto l3 = new ConsoleLogger(LogLevel.fatal, new SimpleLogPattern());
72     -------------
73     */
74     this(const LogLevel lv = LogLevel.all, ILogPattern logPattern = new ConfigurableAnsiLogPattern())
75     @trusted
76     {
77         import std.stdio : stdout;
78         super(stdout, lv, logPattern);
79     }
80 
81 }