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 }