1 #include "config.h"
2 
3 #include <stdio.h>
4 #include <stdarg.h>
5 #include <string.h>
6 #include <errno.h>
7 #ifdef _MSC_VER
8 #include <varargs.h>
9 #include "bobins.h"
10 #endif
11 
12 #include <razorback/debug.h>
13 #include <razorback/log.h>
14 #include <razorback/queue.h>
15 #include <razorback/thread.h>
16 #include <razorback/messages.h>
17 #include "runtime_config.h"
18 
19 
20 #include "init.h"
21 
22 #define LOG_CONF_FILE "logging.conf"
23 
24 static struct Queue *sg_logQueue = NULL;
25 static char level_strings[][9] = {
26     "Debug",
27     "Alert",
28     "Critical",
29     "Error",
30     "Warning",
31     "Notice",
32     "Info",
33     "Debug"
34 };
35 
36 
37 bool
configureLogging(void)38 configureLogging (void)
39 {
40 #ifdef _MSC_VER
41 #else //_MSC_VER
42     if (Config_getLogDest() == RZB_LOG_DEST_SYSLOG)
43         openlog (NULL, LOG_PID, Config_getLogFacility());
44 #endif //_MSC_VER
45 
46     if (( sg_logQueue = Queue_Create(LOG_QUEUE, QUEUE_FLAG_SEND, Razorback_Get_Message_Mode())) == NULL)
47     {
48         return false;
49     }
50     return true;
51 }
52 
53 SO_PUBLIC void
rzb_perror(const char * fmt)54 rzb_perror (const char *fmt)
55 {
56     rzb_log (LOG_ERR, fmt, strerror (errno));
57 }
58 
59 SO_PUBLIC void
rzb_log(unsigned level,const char * fmt,...)60 rzb_log (unsigned level, const char *fmt, ...)
61 {
62     char *msg = NULL;
63 	va_list argp;
64     RZB_LOG_DEST_t log_dest = Config_getLogDest();
65     if (level > (unsigned) Config_getLogLevel())
66     {
67         return;
68     }
69 
70     va_start (argp, fmt);
71 
72     if (log_dest != RZB_LOG_DEST_SYSLOG)
73     {
74         if (vasprintf (&msg, fmt, argp) == -1)
75             return;
76     }
77 
78     switch (log_dest)
79     {
80     case RZB_LOG_DEST_SYSLOG:
81 #ifdef _MSC_VER
82 		UNIMPLEMENTED();
83 #else
84         vsyslog (level, fmt, argp);
85 #endif
86         break;
87     case RZB_LOG_DEST_FILE:
88         break;
89     case RZB_LOG_DEST_ERR:
90     default:
91         fprintf (stderr, "%s: %s\n", level_strings[level], msg);
92         break;
93     }
94     va_end (argp);
95     if (msg != NULL)
96         free (msg);
97 }
98 
99 SO_PUBLIC void
rzb_log_remote(uint8_t level,struct EventId * eventId,const char * fmt,...)100 rzb_log_remote (uint8_t level, struct EventId *eventId, const char *fmt, ...)
101 {
102     struct Message *message;
103     char *msg = NULL;
104     struct RazorbackContext *l_pContext;
105 	va_list argp;
106 
107     if (level > (unsigned) Config_getLogLevel())
108     {
109         return;
110     }
111 
112     va_start (argp, fmt);
113 
114     if (vasprintf (&msg, fmt, argp) == -1)
115         return;
116     va_end (argp);
117 
118     l_pContext = Thread_GetCurrentContext ();
119 
120     if ((message = MessageLog_Initialize(l_pContext->uuidNuggetId,
121             level, msg, eventId)) == NULL)
122     {
123         free (msg);
124         return;
125     }
126 
127     Queue_Put(sg_logQueue, message);
128     message->destroy(message);
129     free (msg);
130 }
131 
132 SO_PUBLIC int
rzb_get_log_level()133 rzb_get_log_level ()
134 {
135     return Config_getLogLevel();
136 }
137 
138 SO_PUBLIC RZB_LOG_DEST_t
rzb_get_log_dest()139 rzb_get_log_dest ()
140 {
141     return Config_getLogDest();
142 }
143 
144 SO_PUBLIC void
rzb_debug_logging()145 rzb_debug_logging ()
146 {
147     Config_setLogLevel(LOG_DEBUG);
148     Config_setLogDest(RZB_LOG_DEST_ERR);
149 }
150 
151 
152