1 module sdlogger; 2 3 public import std.experimental.logger; 4 5 import std.format : formattedWrite; 6 import std.array : Appender; 7 import std.algorithm : findSplitAfter; 8 9 /++ SD Simple Logger 10 11 Used stderr for output with systemd specific syntax. 12 13 For using: `sharedLog = new SDSimpleLogger;` 14 +/ 15 class SDSimpleLogger : Logger 16 { 17 int[LogLevel] levelRemap; 18 19 Appender!(char[]) buffer; 20 21 this(LogLevel ll=LogLevel.all) 22 { 23 super(ll); 24 levelRemap[LogLevel.all] = 7; 25 levelRemap[LogLevel.trace] = 7; 26 levelRemap[LogLevel.info] = 6; 27 // no "notice" (5) level in std.experimental.logger 28 levelRemap[LogLevel.warning] = 4; 29 levelRemap[LogLevel.error] = 3; 30 levelRemap[LogLevel.critical] = 2; 31 levelRemap[LogLevel.fatal] = 1; 32 levelRemap[LogLevel.off] = 1; 33 levelRemap.rehash(); 34 35 buffer.reserve(1024); 36 } 37 38 override void writeLogMsg(ref LogEntry p) @trusted 39 { 40 import std.stdio : stderr; 41 buffer.clear(); 42 formattedWrite(buffer, "<%d>[%s:%d] %s", 43 levelRemap[p.logLevel], 44 p.file.findSplitAfter("source/")[1], p.line, 45 p.msg); 46 stderr.writeln(buffer.data); 47 } 48 } 49 50 /++ SD Simple Logger 51 52 Used sd_journal_print for output. 53 54 For using: `sharedLog = new SDJournalLogger;` 55 +/ 56 class SDJournalLogger : SDSimpleLogger 57 { 58 import sdnotify; 59 60 this(LogLevel ll=LogLevel.all) 61 { 62 super(ll); 63 initSystemDLib(); 64 } 65 66 override void writeLogMsg(ref LogEntry p) @trusted 67 { 68 buffer.clear(); 69 formattedWrite(buffer, "[%s:%d] %s", 70 p.file.findSplitAfter("source/")[1], p.line, p.msg); 71 sd_journal_print(levelRemap[p.logLevel], "%.*s", 72 cast(int)buffer.data.length, 73 buffer.data.ptr); 74 } 75 }