1 /** 2 Central logging facility for vibe. 3 4 Copyright: © 2012 rejectedsoftware e.K. 5 License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. 6 Authors: Sönke Ludwig 7 */ 8 module dub.internal.vibecompat.core.log; 9 10 import std.array; 11 import std.datetime; 12 import std.format; 13 import std.stdio; 14 import core.thread; 15 16 private { 17 shared LogLevel s_minLevel = LogLevel.info; 18 shared LogLevel s_logFileLevel; 19 } 20 21 /// Sets the minimum log level to be printed. 22 void setLogLevel(LogLevel level) nothrow 23 { 24 s_minLevel = level; 25 } 26 27 LogLevel getLogLevel() 28 { 29 return s_minLevel; 30 } 31 32 /** 33 Logs a message. 34 35 Params: 36 level = The log level for the logged message 37 fmt = See http://dlang.org/phobos/std_format.html#format-string 38 */ 39 void logDebug(T...)(string fmt, lazy T args) nothrow { log(LogLevel.debug_, fmt, args); } 40 /// ditto 41 void logDiagnostic(T...)(string fmt, lazy T args) nothrow { log(LogLevel.diagnostic, fmt, args); } 42 /// ditto 43 void logInfo(T...)(string fmt, lazy T args) nothrow { log(LogLevel.info, fmt, args); } 44 /// ditto 45 void logWarn(T...)(string fmt, lazy T args) nothrow { log(LogLevel.warn, fmt, args); } 46 /// ditto 47 void logError(T...)(string fmt, lazy T args) nothrow { log(LogLevel.error, fmt, args); } 48 49 /// ditto 50 void log(T...)(LogLevel level, string fmt, lazy T args) 51 nothrow { 52 if( level < s_minLevel ) return; 53 string pref; 54 final switch( level ){ 55 case LogLevel.debug_: pref = "trc"; break; 56 case LogLevel.diagnostic: pref = "dbg"; break; 57 case LogLevel.info: pref = "INF"; break; 58 case LogLevel.warn: pref = "WRN"; break; 59 case LogLevel.error: pref = "ERR"; break; 60 case LogLevel.fatal: pref = "FATAL"; break; 61 case LogLevel.none: assert(false); 62 } 63 64 try { 65 auto txt = appender!string(); 66 txt.reserve(256); 67 formattedWrite(txt, fmt, args); 68 69 auto threadid = () @trusted { return cast(ulong)cast(void*)Thread.getThis(); } (); 70 auto fiberid = () @trusted { return cast(ulong)cast(void*)Fiber.getThis(); } (); 71 threadid ^= threadid >> 32; 72 fiberid ^= fiberid >> 32; 73 74 if (level >= s_minLevel) { 75 File output; 76 if (level == LogLevel.info) () @trusted { output = stdout; } (); 77 else () @trusted { output = stderr; } (); 78 if (output.isOpen) { 79 output.writeln(txt.data); 80 output.flush(); 81 } 82 } 83 } catch( Exception e ){ 84 // this is bad but what can we do.. 85 debug assert(false, e.msg); 86 } 87 } 88 89 /// Specifies the log level for a particular log message. 90 enum LogLevel { 91 debug_, 92 diagnostic, 93 info, 94 warn, 95 error, 96 fatal, 97 none 98 } 99