]> mj.ucw.cz Git - libucw.git/blob - ucw/log-syslog.c
f92b616584910096d8e273258c80e00b96ecf1cc
[libucw.git] / ucw / log-syslog.c
1 /*
2  *      UCW Library -- Logging to Syslog
3  *
4  *      (c) 2009 Martin Mares <mj@ucw.cz>
5  *      (c) 2008 Tomas Gavenciak <gavento@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #include "ucw/lib.h"
12 #include "ucw/log.h"
13
14 #include <syslog.h>
15
16 /* destructor for syslog logs */
17 static void ls_syslog_close(struct log_stream *ls)
18 {
19   ASSERT(ls);
20   if(ls->name)
21     xfree(ls->name);
22 }
23
24 /* convert severity level to syslog constants */
25 static int ls_syslog_convert_level(int level)
26 {
27   switch(level)
28   {
29     case L_DEBUG: return LOG_DEBUG;
30     case L_INFO: return LOG_INFO;
31     case L_INFO_R: return LOG_INFO;
32     case L_WARN: return LOG_WARNING;
33     case L_WARN_R: return LOG_WARNING;
34     case L_ERROR: return LOG_ERR;
35     case L_ERROR_R: return LOG_ERR;
36     case L_FATAL: return LOG_CRIT;
37     default: return LOG_NOTICE;
38   }
39 }
40
41 /* simple syslog write handler */
42 static int ls_syslog_handler(struct log_stream *ls, const char *m, uns flags)
43 {
44   int prio;
45   ASSERT(ls);
46   ASSERT(m);
47
48   prio = ls_syslog_convert_level(LS_GET_LEVEL(flags)) | (ls->idata);
49   if (ls->name)
50     syslog(prio | (ls->idata), "%s: %s", ls->name, m);
51   else
52     syslog(prio | (ls->idata), "%s", m);
53   return 0;
54 }
55
56 /* assign log to a syslog facility */
57 /* initialize with no formatting (syslog adds these inforamtion) */
58 /* name is optional prefix (NULL for none) */
59 struct log_stream *ls_syslog_new(int facility, const char *name)
60 {
61   struct log_stream *ls=ls_new();
62   if (name) ls->name = xstrdup(name);
63   ls->idata = facility;
64   ls->msgfmt = LSFMT_NONE;
65   ls->handler = ls_syslog_handler;
66   ls->close = ls_syslog_close;
67   return ls;
68 }