1 // Written in the D programming language. 2 3 /** 4 DLANGUI library. 5 6 This module contains logger implementation. 7 8 9 10 Synopsis: 11 12 ---- 13 import dlangui.core.logger; 14 15 // use stderror for logging 16 setStderrLogger(); 17 // set log level 18 setLogLevel(LogLeve.Debug); 19 // log debug message 20 Log.d("mouse clicked at ", x, ",", y); 21 // log error message 22 Log.d("exception while reading file", e); 23 24 ---- 25 26 Copyright: Vadim Lopatin, 2014 27 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 28 Authors: $(WEB coolreader.org, Vadim Lopatin) 29 */ 30 module dlangui.core.logger; 31 32 import std.stdio; 33 import std.datetime; 34 35 enum LogLevel : int { 36 Fatal, 37 Error, 38 Warn, 39 Info, 40 Debug, 41 Trace 42 } 43 44 __gshared LogLevel logLevel = LogLevel.Info; 45 __gshared std.stdio.File logFile; 46 47 void setLogLevel(LogLevel level) { 48 logLevel = level; 49 } 50 51 long currentTimeMillis() { 52 return std.datetime.Clock.currStdTime / 10000; 53 } 54 55 void setStdoutLogger() { 56 logFile = stdout; 57 } 58 59 void setStderrLogger() { 60 logFile = stderr; 61 } 62 63 void setFileLogger(File file) { 64 logFile = file; 65 } 66 67 class Log { 68 static string logLevelName(LogLevel level) { 69 switch (level) { 70 case LogLevel.Fatal: return "F"; 71 case LogLevel.Error: return "E"; 72 case LogLevel.Warn: return "W"; 73 case LogLevel.Info: return "I"; 74 case LogLevel.Debug: return "D"; 75 case LogLevel.Trace: return "V"; 76 default: return "?"; 77 } 78 } 79 static void log(S...)(LogLevel level, S args) { 80 if (logLevel >= level && logFile.isOpen) { 81 SysTime ts = Clock.currTime(); 82 logFile.writef("%04d-%02d-%02d %02d:%02d:%02d.%03d %s ", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fracSec.msecs, logLevelName(level)); 83 logFile.writeln(args); 84 logFile.flush(); 85 } 86 } 87 static void v(S...)(S args) { 88 if (logLevel >= LogLevel.Trace && logFile.isOpen) 89 log(LogLevel.Trace, args); 90 } 91 static void d(S...)(S args) { 92 if (logLevel >= LogLevel.Debug && logFile.isOpen) 93 log(LogLevel.Debug, args); 94 } 95 static void i(S...)(S args) { 96 if (logLevel >= LogLevel.Info && logFile.isOpen) 97 log(LogLevel.Info, args); 98 } 99 static void w(S...)(S args) { 100 if (logLevel >= LogLevel.Warn && logFile.isOpen) 101 log(LogLevel.Warn, args); 102 } 103 static void e(S...)(S args) { 104 if (logLevel >= LogLevel.Error && logFile.isOpen) 105 log(LogLevel.Error, args); 106 } 107 static void f(S...)(S args) { 108 if (logLevel >= LogLevel.Fatal && logFile.isOpen) 109 log(LogLevel.Fatal, args); 110 } 111 }