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 }