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 }