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