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 }