46 #include <qb/qbdefs.h>
47 #include <qb/qbutil.h>
65 {
"alert", LOG_ALERT },
67 {
"debug", LOG_DEBUG },
68 {
"emerg", LOG_EMERG },
72 {
"notice", LOG_NOTICE },
73 {
"warning", LOG_WARNING },
77 #define MAX_FILES_PER_SUBSYS 32
78 #ifdef HAVE_SMALL_MEMORY_FOOTPRINT
79 #define IPC_LOGSYS_SIZE 8192*64
81 #define IPC_LOGSYS_SIZE 8192*1024
103 #define LOGSYS_LOGGER_INIT_DONE 0
104 #define LOGSYS_LOGGER_NEEDS_INIT 1
110 static pthread_mutex_t logsys_config_mutex = PTHREAD_MUTEX_INITIALIZER;
112 static int32_t _logsys_config_mode_set_unlocked(int32_t subsysid, uint32_t new_mode);
113 static void _logsys_config_apply_per_file(int32_t s,
const char *filename);
114 static void _logsys_config_apply_per_subsys(int32_t s);
115 static void _logsys_subsys_filename_add (int32_t s,
const char *filename);
116 static void logsys_file_format_get(
char* file_format,
int buf_len);
118 static char *format_buffer=NULL;
120 static int logsys_thread_started = 0;
122 static int _logsys_config_subsys_get_unlocked (
const char *
subsys)
131 if (strcmp (logsys_loggers[i].subsys, subsys) == 0) {
144 static int logsys_config_file_set_unlocked (
146 const char **error_string,
149 static char error_string_response[512];
151 char file_format[128];
153 if (logsys_loggers[subsysid].
target_id > 0) {
155 for (f = 0; f < logsys_loggers[subsysid].
file_idx; f++) {
156 qb_log_filter_ctl(logsys_loggers[subsysid].
target_id,
157 QB_LOG_FILTER_REMOVE,
159 logsys_loggers[subsysid].
files[f],
164 logsys_loggers[subsysid].
dirty = QB_TRUE;
169 if (strlen(file) >= PATH_MAX) {
170 snprintf (error_string_response,
171 sizeof(error_string_response),
172 "%s: logfile name exceed maximum system filename lenght",
173 logsys_loggers[subsysid].subsys);
174 *error_string = error_string_response;
179 if ((logsys_loggers[i].
logfile != NULL) &&
180 (strcmp (logsys_loggers[i].
logfile, file) == 0) &&
189 logsys_loggers[subsysid].
logfile = strdup(file);
190 if (logsys_loggers[subsysid].logfile == NULL) {
191 snprintf (error_string_response,
192 sizeof(error_string_response),
193 "Unable to allocate memory for logfile '%s'",
195 *error_string = error_string_response;
199 if (logsys_loggers[subsysid].
target_id > 0) {
200 int num_using_current = 0;
202 if (logsys_loggers[subsysid].
target_id ==
207 if (num_using_current == 1) {
209 qb_log_file_close(logsys_loggers[subsysid].
target_id);
213 logsys_loggers[subsysid].
target_id = qb_log_file_open(file);
214 if (logsys_loggers[subsysid].
target_id < 0) {
215 int err = -logsys_loggers[subsysid].
target_id;
217 const char *error_ptr;
218 error_ptr = qb_strerror_r(err, error_str,
sizeof(error_str));
220 free(logsys_loggers[subsysid].logfile);
221 logsys_loggers[subsysid].
logfile = NULL;
222 snprintf (error_string_response,
223 sizeof(error_string_response),
224 "Can't open logfile '%s' for reason: %s (%d)",
225 file, error_ptr, err);
226 *error_string = error_string_response;
229 logsys_file_format_get(file_format, 128);
230 qb_log_format_set(logsys_loggers[subsysid].
target_id, file_format);
232 qb_log_ctl(logsys_loggers[subsysid].
target_id,
235 if (logsys_thread_started) {
236 qb_log_ctl(logsys_loggers[subsysid].target_id, QB_LOG_CONF_THREADED, QB_TRUE);
242 static void logsys_subsys_init (
256 strncpy (logsys_loggers[subsysid].subsys, subsys,
257 sizeof (logsys_loggers[subsysid].subsys));
258 logsys_loggers[subsysid].
subsys[
259 sizeof (logsys_loggers[subsysid].
subsys) - 1] =
'\0';
260 logsys_loggers[subsysid].
file_idx = 0;
263 static const char *_logsys_tags_stringify(uint32_t tags)
265 if (tags == QB_LOG_TAG_LIBQB_MSG) {
268 return logsys_loggers[tags].
subsys;
277 free(logsys_loggers[i].logfile);
278 for (f = 0; f < logsys_loggers[i].
file_idx; f++) {
279 free(logsys_loggers[i].
files[f]);
291 const char *mainsystem,
300 if ((mainsystem == NULL) ||
312 _logsys_subsys_filename_add (i,
"log.c");
313 _logsys_subsys_filename_add (i,
"log_syslog.c");
314 _logsys_subsys_filename_add (i,
"log_blackbox.c");
315 _logsys_subsys_filename_add (i,
"log_format.c");
316 _logsys_subsys_filename_add (i,
"log_file.c");
317 _logsys_subsys_filename_add (i,
"log_dcs.c");
318 _logsys_subsys_filename_add (i,
"log_thread.c");
319 _logsys_subsys_filename_add (i,
"ipc_shm.c");
320 _logsys_subsys_filename_add (i,
"ipcs.c");
321 _logsys_subsys_filename_add (i,
"ipc_us.c");
322 _logsys_subsys_filename_add (i,
"loop.c");
323 _logsys_subsys_filename_add (i,
"loop_poll_epoll.c");
324 _logsys_subsys_filename_add (i,
"loop_job.c");
325 _logsys_subsys_filename_add (i,
"loop_poll_poll.c");
326 _logsys_subsys_filename_add (i,
"loop_poll_kqueue.c");
327 _logsys_subsys_filename_add (i,
"loop_timerlist.c");
328 _logsys_subsys_filename_add (i,
"loop_poll.c");
329 _logsys_subsys_filename_add (i,
"ringbuffer.c");
330 _logsys_subsys_filename_add (i,
"ringbuffer_helper.c");
331 _logsys_subsys_filename_add (i,
"trie.c");
332 _logsys_subsys_filename_add (i,
"map.c");
333 _logsys_subsys_filename_add (i,
"skiplist.c");
334 _logsys_subsys_filename_add (i,
"rpl_sem.c");
335 _logsys_subsys_filename_add (i,
"hdb.c");
336 _logsys_subsys_filename_add (i,
"unix.c");
344 pthread_mutex_lock (&logsys_config_mutex);
346 snprintf(logsys_loggers[i].subsys,
356 qb_log_init(mainsystem, syslog_facility, syslog_priority);
358 qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);
360 qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_FALSE);
363 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE);
365 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
367 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_PRIORITY_BUMP, LOG_INFO - LOG_DEBUG);
369 qb_log_filter_ctl(QB_LOG_BLACKBOX, QB_LOG_FILTER_ADD,
370 QB_LOG_FILTER_FILE,
"*", LOG_TRACE);
372 qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_THREADED, QB_FALSE);
373 qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
379 qb_log_tags_stringify_fn_set(_logsys_tags_stringify);
385 if ((strcmp (logsys_loggers[i].subsys,
"") != 0) &&
389 strncpy (tempsubsys, logsys_loggers[i].subsys,
390 sizeof (tempsubsys));
391 tempsubsys[
sizeof (tempsubsys) - 1] =
'\0';
392 logsys_subsys_init(tempsubsys, i);
394 _logsys_config_mode_set_unlocked(i, logsys_loggers[i].mode);
395 _logsys_config_apply_per_subsys(i);
399 pthread_mutex_unlock (&logsys_config_mutex);
405 static void _logsys_subsys_filename_add (int32_t s,
const char *filename)
409 if (filename == NULL) {
413 assert(logsys_loggers[s].
file_idx >= 0);
415 for (i = 0; i < logsys_loggers[s].
file_idx; i++) {
416 if (strcmp(logsys_loggers[s].
files[i], filename) == 0) {
420 logsys_loggers[s].
files[logsys_loggers[s].
file_idx++] = strdup(filename);
423 _logsys_config_apply_per_file(s, filename);
431 if ((subsys == NULL) ||
436 pthread_mutex_lock (&logsys_config_mutex);
438 i = _logsys_config_subsys_get_unlocked (subsys);
440 _logsys_subsys_filename_add(i, filename);
441 pthread_mutex_unlock (&logsys_config_mutex);
446 if (strcmp (logsys_loggers[i].subsys,
"") == 0) {
447 logsys_subsys_init(subsys, i);
448 _logsys_subsys_filename_add(i, filename);
453 if (i >= LOGSYS_MAX_SUBSYS_COUNT) {
457 pthread_mutex_unlock (&logsys_config_mutex);
465 pthread_mutex_lock (&logsys_config_mutex);
467 i = _logsys_config_subsys_get_unlocked (subsys);
469 pthread_mutex_unlock (&logsys_config_mutex);
474 static int32_t _logsys_config_mode_set_unlocked(int32_t subsysid, uint32_t new_mode)
476 if ( logsys_loggers[subsysid].
mode == new_mode) {
479 if (logsys_loggers[subsysid].target_id > 0) {
480 qb_log_ctl(logsys_loggers[subsysid].target_id,
486 qb_log_ctl(QB_LOG_STDERR,
489 qb_log_ctl(QB_LOG_SYSLOG,
493 logsys_loggers[subsysid].
mode = new_mode;
501 pthread_mutex_lock (&logsys_config_mutex);
502 if (subsys != NULL) {
503 i = _logsys_config_subsys_get_unlocked (subsys);
505 i = _logsys_config_mode_set_unlocked(i, mode);
509 _logsys_config_mode_set_unlocked(i, mode);
514 pthread_mutex_unlock (&logsys_config_mutex);
528 return logsys_loggers[i].
mode;
533 const char **error_string,
539 pthread_mutex_lock (&logsys_config_mutex);
541 if (subsys != NULL) {
542 i = _logsys_config_subsys_get_unlocked (subsys);
546 res = logsys_config_file_set_unlocked(i, error_string, file);
550 res = logsys_config_file_set_unlocked(i, error_string, file);
557 pthread_mutex_unlock (&logsys_config_mutex);
562 logsys_file_format_get(
char* file_format,
int buf_len)
565 file_format[0] =
'\0';
566 per_t = strstr(format_buffer,
"%t");
568 strcpy(file_format,
"%t [%P] %H %N");
570 strncat(file_format, per_t, buf_len - strlen(
"%t [%P] %H %N"));
572 strcpy(file_format,
"[%P] %H %N");
573 strncat(file_format, format_buffer, buf_len - strlen(
"[%P] %H %N"));
583 char syslog_format[128];
584 char file_format[128];
588 format_buffer = NULL;
591 format_buffer = strdup(format ? format :
"%7p [%6g] %b");
592 if (format_buffer == NULL) {
596 qb_log_format_set(QB_LOG_STDERR, format_buffer);
598 logsys_file_format_get(file_format, 128);
600 if (logsys_loggers[i].target_id > 0) {
601 qb_log_format_set(logsys_loggers[i].target_id, file_format);
610 memset(syslog_format,
'\0',
sizeof(syslog_format));
611 for (c = 0; c < strlen(format_buffer); c++) {
612 if (format_buffer[c] ==
'%') {
614 for (c++; c < strlen(format_buffer); c++) {
615 if (isdigit(format_buffer[c])) {
618 if (format_buffer[c] ==
't' ||
619 format_buffer[c] ==
'p') {
627 syslog_format[w] = format_buffer[c];
630 qb_log_format_set(QB_LOG_SYSLOG, syslog_format);
637 return format_buffer;
642 unsigned int facility)
644 return qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_FACILITY, facility);
649 unsigned int priority)
653 pthread_mutex_lock (&logsys_config_mutex);
654 if (subsys != NULL) {
655 i = _logsys_config_subsys_get_unlocked (subsys);
658 logsys_loggers[i].
dirty = QB_TRUE;
665 logsys_loggers[i].
dirty = QB_TRUE;
669 pthread_mutex_unlock (&logsys_config_mutex);
676 unsigned int priority)
680 pthread_mutex_lock (&logsys_config_mutex);
681 if (subsys != NULL) {
682 i = _logsys_config_subsys_get_unlocked (subsys);
685 logsys_loggers[i].
dirty = QB_TRUE;
691 logsys_loggers[i].
dirty = QB_TRUE;
695 pthread_mutex_unlock (&logsys_config_mutex);
701 static void _logsys_config_apply_per_file(int32_t s,
const char *filename)
706 qb_log_filter_ctl(s, QB_LOG_TAG_SET, QB_LOG_FILTER_FILE,
707 filename, LOG_TRACE);
709 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_REMOVE,
710 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
711 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_REMOVE,
712 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
713 if (logsys_loggers[s].target_id > 0) {
714 qb_log_filter_ctl(logsys_loggers[s].target_id,
715 QB_LOG_FILTER_REMOVE,
716 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
720 switch (logsys_loggers[s].
debug) {
722 syslog_priority = LOG_DEBUG;
723 logfile_priority = LOG_DEBUG;
726 syslog_priority = LOG_TRACE;
727 logfile_priority = LOG_TRACE;
733 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD,
734 QB_LOG_FILTER_FILE, filename,
736 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
737 QB_LOG_FILTER_FILE, filename,
739 if (logsys_loggers[s].target_id > 0) {
740 qb_log_filter_ctl(logsys_loggers[s].target_id,
742 QB_LOG_FILTER_FILE, filename,
747 static void _logsys_config_apply_per_subsys(int32_t s)
750 for (f = 0; f < logsys_loggers[s].
file_idx; f++) {
751 _logsys_config_apply_per_file(s, logsys_loggers[s].
files[f]);
753 if (logsys_loggers[s].target_id > 0) {
754 qb_log_ctl(logsys_loggers[s].target_id,
758 logsys_loggers[s].
dirty = QB_FALSE;
766 if (strcmp(logsys_loggers[s].subsys,
"") == 0) {
769 _logsys_config_apply_per_subsys(s);
779 pthread_mutex_lock (&logsys_config_mutex);
780 if (subsys != NULL) {
781 i = _logsys_config_subsys_get_unlocked (subsys);
783 logsys_loggers[i].
dirty = QB_TRUE;
790 logsys_loggers[i].
dirty = QB_TRUE;
794 pthread_mutex_unlock (&logsys_config_mutex);
803 for (i = 0; prioritynames[i].
c_name != NULL; i++) {
804 if (strcasecmp(name, prioritynames[i].c_name) == 0) {
805 return (prioritynames[i].c_val);
816 err = qb_log_thread_start();
821 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, QB_TRUE);
823 if (logsys_loggers[i].target_id > 0) {
824 qb_log_ctl(logsys_loggers[i].target_id, QB_LOG_CONF_THREADED, QB_TRUE);
828 logsys_thread_started = 1;
#define LOGSYS_DEBUG_TRACE
#define LOGSYS_MAX_PERROR_MSG_LEN
int logsys_config_file_set(const char *subsys, const char **error_string, const char *file)
#define LOGSYS_MAX_SUBSYS_NAMELEN
int _logsys_subsys_create(const char *subsys, const char *filename)
#define LOGSYS_MODE_OUTPUT_FILE
int logsys_config_debug_set(const char *subsys, unsigned int value)
#define LOGSYS_MAX_SUBSYS_COUNT
int logsys_config_syslog_facility_set(const char *subsys, unsigned int facility)
int logsys_config_mode_set(const char *subsys, unsigned int mode)
#define LOGSYS_LOGGER_NEEDS_INIT
char subsys[LOGSYS_MAX_SUBSYS_NAMELEN]
int logsys_thread_start(void)
char * logsys_format_get(void)
#define LOGSYS_MODE_OUTPUT_SYSLOG
int logsys_config_syslog_priority_set(const char *subsys, unsigned int priority)
int _logsys_system_setup(const char *mainsystem, unsigned int mode, int syslog_facility, int syslog_priority)
#define MAX_FILES_PER_SUBSYS
void logsys_config_apply(void)
int logsys_priority_id_get(const char *name)
#define LOGSYS_LOGGER_INIT_DONE
int _logsys_config_subsys_get(const char *subsys)
unsigned int logsys_config_mode_get(const char *subsys)
char * files[MAX_FILES_PER_SUBSYS]
int logsys_config_logfile_priority_set(const char *subsys, unsigned int priority)
#define LOGSYS_MODE_OUTPUT_STDERR
int logsys_format_set(const char *format)
void logsys_system_fini(void)