1 2 module logging.sinks.SysLogSink; 3 4 import std.datetime; 5 import std.string; 6 import logging.sinks.LogSink; 7 import logging.formatters; 8 9 private import logging.syslog; 10 11 private enum int[LogLevel] LOGLEVEL_TO_SYSLOG_PRIORITY = 12 [ 13 LogLevel.Error : LOG_ERR, 14 LogLevel.Warning: LOG_WARNING, 15 LogLevel.Info : LOG_INFO, 16 LogLevel.Debug : LOG_DEBUG, 17 LogLevel.Trace : LOG_DEBUG 18 ]; 19 20 21 public class SysLogSink : LogSinkBase 22 { 23 public this(string ident, Formatter fmt = null) 24 { 25 if(fmt is null) 26 { 27 fmt = new DefaultSyslogFormatter; 28 } 29 30 _formatter = fmt; 31 32 openlog(ident.ptr, 0, 0); 33 } 34 35 public ~this() 36 { 37 closelog(); 38 } 39 40 public override void _log(LogLevel loglevel, string m, string func, size_t line, SysTime time, string msg, uint thread_id) 41 { 42 auto fmsg = _formatter.format(loglevel, m, func, line, time, msg, thread_id); 43 44 auto priority = LOGLEVEL_TO_SYSLOG_PRIORITY[loglevel]; 45 46 .syslog(priority, "%s", toStringz(fmsg)); 47 } 48 49 public void formatter(Formatter fmt) @property 50 { 51 _formatter = fmt; 52 } 53 54 private Formatter _formatter; 55 }