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 }