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 (logsys_loggers[subsysid].
target_id > 0 &&
170 logsys_loggers[subsysid].
logfile != NULL &&
171 strcmp(file, logsys_loggers[subsysid].
logfile) == 0) {
175 if (strlen(file) >= PATH_MAX) {
176 snprintf (error_string_response,
177 sizeof(error_string_response),
178 "%s: logfile name exceed maximum system filename length",
179 logsys_loggers[subsysid].subsys);
180 *error_string = error_string_response;
184 if (logsys_loggers[subsysid].logfile != NULL) {
185 free(logsys_loggers[subsysid].logfile);
186 logsys_loggers[subsysid].
logfile = NULL;
189 logsys_loggers[subsysid].
logfile = strdup(file);
191 if (logsys_loggers[subsysid].logfile == NULL) {
192 snprintf (error_string_response,
193 sizeof(error_string_response),
194 "Unable to allocate memory for logfile '%s'",
196 *error_string = error_string_response;
201 if ((logsys_loggers[i].logfile != NULL) &&
202 (strcmp (logsys_loggers[i].logfile, file) == 0) &&
212 if (logsys_loggers[subsysid].
target_id > 0) {
213 int num_using_current = 0;
215 if (logsys_loggers[subsysid].
target_id ==
220 if (num_using_current == 1) {
222 qb_log_file_close(logsys_loggers[subsysid].
target_id);
226 logsys_loggers[subsysid].
target_id = qb_log_file_open(file);
227 if (logsys_loggers[subsysid].
target_id < 0) {
228 int err = -logsys_loggers[subsysid].
target_id;
230 const char *error_ptr;
231 error_ptr = qb_strerror_r(err, error_str,
sizeof(error_str));
233 free(logsys_loggers[subsysid].logfile);
234 logsys_loggers[subsysid].
logfile = NULL;
235 snprintf (error_string_response,
236 sizeof(error_string_response),
237 "Can't open logfile '%s' for reason: %s (%d)",
238 file, error_ptr, err);
239 *error_string = error_string_response;
242 logsys_file_format_get(file_format, 128);
243 qb_log_format_set(logsys_loggers[subsysid].
target_id, file_format);
245 qb_log_ctl(logsys_loggers[subsysid].
target_id,
248 if (logsys_thread_started) {
249 qb_log_ctl(logsys_loggers[subsysid].target_id, QB_LOG_CONF_THREADED, QB_TRUE);
255 static void logsys_subsys_init (
269 strncpy (logsys_loggers[subsysid].subsys, subsys,
270 sizeof (logsys_loggers[subsysid].subsys));
271 logsys_loggers[subsysid].
subsys[
272 sizeof (logsys_loggers[subsysid].
subsys) - 1] =
'\0';
273 logsys_loggers[subsysid].
file_idx = 0;
276 static const char *_logsys_tags_stringify(uint32_t tags)
278 if (tags == QB_LOG_TAG_LIBQB_MSG) {
281 return logsys_loggers[tags].
subsys;
290 free(logsys_loggers[i].logfile);
291 for (f = 0; f < logsys_loggers[i].
file_idx; f++) {
292 free(logsys_loggers[i].
files[f]);
304 const char *mainsystem,
312 int blackbox_enable_res;
314 if ((mainsystem == NULL) ||
323 "log_file.c,log_dcs.c,log_thread.c,ipc_shm.c,ipcs.c,ipc_us.c,loop.c," 324 "loop_poll_epoll.c,loop_job.c,loop_poll_poll.c,loop_poll_kqueue.c," 325 "loop_timerlist.c,loop_poll.c,ringbuffer.c,ringbuffer_helper.c,trie.c," 326 "map.c,skiplist.c,rpl_sem.c,hdb.c,unix.c,hashtable.c,strlcpy.c,ipc_socket.c," 327 "strchrnul.c,ipc_setup.c,strlcat.c");
341 _logsys_subsys_filename_add (i,
"logsys.c");
345 pthread_mutex_lock (&logsys_config_mutex);
347 snprintf(logsys_loggers[i].subsys,
357 qb_log_init(mainsystem, syslog_facility, syslog_priority);
359 qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_TRUE);
361 qb_log_ctl(QB_LOG_STDERR, QB_LOG_CONF_ENABLED, QB_FALSE);
364 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_TRUE);
366 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_ENABLED, QB_FALSE);
368 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_PRIORITY_BUMP, LOG_INFO - LOG_DEBUG);
370 qb_log_filter_ctl(QB_LOG_BLACKBOX, QB_LOG_FILTER_ADD,
371 QB_LOG_FILTER_FILE,
"*", LOG_TRACE);
373 qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_THREADED, QB_FALSE);
374 blackbox_enable_res = qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_TRUE);
380 qb_log_tags_stringify_fn_set(_logsys_tags_stringify);
386 if ((strcmp (logsys_loggers[i].subsys,
"") != 0) &&
390 strncpy (tempsubsys, logsys_loggers[i].subsys,
391 sizeof (tempsubsys));
392 tempsubsys[
sizeof (tempsubsys) - 1] =
'\0';
393 logsys_subsys_init(tempsubsys, i);
395 _logsys_config_mode_set_unlocked(i, logsys_loggers[i].mode);
396 _logsys_config_apply_per_subsys(i);
400 if (blackbox_enable_res < 0) {
402 "Unable to initialize log flight recorder. "\
403 "The most common cause of this error is " \
404 "not enough space on /dev/shm. Corosync will continue work, " \
405 "but blackbox will not be available");
408 pthread_mutex_unlock (&logsys_config_mutex);
414 static void _logsys_subsys_filename_add (int32_t s,
const char *filename)
418 if (filename == NULL) {
422 assert(logsys_loggers[s].
file_idx >= 0);
424 for (i = 0; i < logsys_loggers[s].
file_idx; i++) {
425 if (strcmp(logsys_loggers[s].
files[i], filename) == 0) {
429 logsys_loggers[s].
files[logsys_loggers[s].
file_idx++] = strdup(filename);
432 _logsys_config_apply_per_file(s, filename);
440 if ((subsys == NULL) ||
445 pthread_mutex_lock (&logsys_config_mutex);
447 i = _logsys_config_subsys_get_unlocked (subsys);
449 _logsys_subsys_filename_add(i, filename);
450 pthread_mutex_unlock (&logsys_config_mutex);
455 if (strcmp (logsys_loggers[i].subsys,
"") == 0) {
456 logsys_subsys_init(subsys, i);
457 _logsys_subsys_filename_add(i, filename);
462 if (i >= LOGSYS_MAX_SUBSYS_COUNT) {
466 pthread_mutex_unlock (&logsys_config_mutex);
474 pthread_mutex_lock (&logsys_config_mutex);
476 i = _logsys_config_subsys_get_unlocked (subsys);
478 pthread_mutex_unlock (&logsys_config_mutex);
483 static int32_t _logsys_config_mode_set_unlocked(int32_t subsysid, uint32_t new_mode)
485 if ( logsys_loggers[subsysid].
mode == new_mode) {
488 if (logsys_loggers[subsysid].target_id > 0) {
489 qb_log_ctl(logsys_loggers[subsysid].target_id,
495 qb_log_ctl(QB_LOG_STDERR,
498 qb_log_ctl(QB_LOG_SYSLOG,
502 logsys_loggers[subsysid].
mode = new_mode;
510 pthread_mutex_lock (&logsys_config_mutex);
511 if (subsys != NULL) {
512 i = _logsys_config_subsys_get_unlocked (subsys);
514 i = _logsys_config_mode_set_unlocked(i, mode);
518 _logsys_config_mode_set_unlocked(i, mode);
523 pthread_mutex_unlock (&logsys_config_mutex);
537 return logsys_loggers[i].
mode;
542 const char **error_string,
548 pthread_mutex_lock (&logsys_config_mutex);
550 if (subsys != NULL) {
551 i = _logsys_config_subsys_get_unlocked (subsys);
555 res = logsys_config_file_set_unlocked(i, error_string, file);
559 res = logsys_config_file_set_unlocked(i, error_string, file);
566 pthread_mutex_unlock (&logsys_config_mutex);
571 logsys_file_format_get(
char* file_format,
int buf_len)
574 file_format[0] =
'\0';
575 per_t = strstr(format_buffer,
"%t");
577 strcpy(file_format,
"%t [%P] %H %N");
579 strncat(file_format, per_t, buf_len - strlen(
"%t [%P] %H %N"));
581 strcpy(file_format,
"[%P] %H %N");
582 strncat(file_format, format_buffer, buf_len - strlen(
"[%P] %H %N"));
592 char syslog_format[128];
593 char file_format[128];
597 format_buffer = NULL;
600 format_buffer = strdup(format ? format :
"%7p [%6g] %b");
601 if (format_buffer == NULL) {
605 qb_log_format_set(QB_LOG_STDERR, format_buffer);
607 logsys_file_format_get(file_format, 128);
609 if (logsys_loggers[i].target_id > 0) {
610 qb_log_format_set(logsys_loggers[i].target_id, file_format);
619 memset(syslog_format,
'\0',
sizeof(syslog_format));
620 for (c = 0; c < strlen(format_buffer); c++) {
621 if (format_buffer[c] ==
'%') {
623 for (c++; c < strlen(format_buffer); c++) {
624 if (isdigit(format_buffer[c])) {
627 if (format_buffer[c] ==
't' ||
628 format_buffer[c] ==
'p') {
636 syslog_format[w] = format_buffer[c];
639 qb_log_format_set(QB_LOG_SYSLOG, syslog_format);
646 return format_buffer;
651 unsigned int facility)
653 return qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_FACILITY, facility);
658 unsigned int priority)
662 pthread_mutex_lock (&logsys_config_mutex);
663 if (subsys != NULL) {
664 i = _logsys_config_subsys_get_unlocked (subsys);
667 logsys_loggers[i].
dirty = QB_TRUE;
674 logsys_loggers[i].
dirty = QB_TRUE;
678 pthread_mutex_unlock (&logsys_config_mutex);
685 unsigned int priority)
689 pthread_mutex_lock (&logsys_config_mutex);
690 if (subsys != NULL) {
691 i = _logsys_config_subsys_get_unlocked (subsys);
694 logsys_loggers[i].
dirty = QB_TRUE;
700 logsys_loggers[i].
dirty = QB_TRUE;
704 pthread_mutex_unlock (&logsys_config_mutex);
710 static void _logsys_config_apply_per_file(int32_t s,
const char *filename)
715 qb_log_filter_ctl(s, QB_LOG_TAG_SET, QB_LOG_FILTER_FILE,
716 filename, LOG_TRACE);
718 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_REMOVE,
719 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
720 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_REMOVE,
721 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
722 if (logsys_loggers[s].target_id > 0) {
723 qb_log_filter_ctl(logsys_loggers[s].target_id,
724 QB_LOG_FILTER_REMOVE,
725 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
729 switch (logsys_loggers[s].
debug) {
731 syslog_priority = LOG_DEBUG;
732 logfile_priority = LOG_DEBUG;
735 syslog_priority = LOG_TRACE;
736 logfile_priority = LOG_TRACE;
742 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD,
743 QB_LOG_FILTER_FILE, filename,
745 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
746 QB_LOG_FILTER_FILE, filename,
748 if (logsys_loggers[s].target_id > 0) {
749 qb_log_filter_ctl(logsys_loggers[s].target_id,
751 QB_LOG_FILTER_FILE, filename,
756 static void _logsys_config_apply_per_subsys(int32_t s)
759 for (f = 0; f < logsys_loggers[s].
file_idx; f++) {
760 _logsys_config_apply_per_file(s, logsys_loggers[s].
files[f]);
762 if (logsys_loggers[s].target_id > 0) {
763 qb_log_ctl(logsys_loggers[s].target_id,
767 logsys_loggers[s].
dirty = QB_FALSE;
775 if (strcmp(logsys_loggers[s].subsys,
"") == 0) {
778 _logsys_config_apply_per_subsys(s);
788 pthread_mutex_lock (&logsys_config_mutex);
789 if (subsys != NULL) {
790 i = _logsys_config_subsys_get_unlocked (subsys);
792 logsys_loggers[i].
dirty = QB_TRUE;
799 logsys_loggers[i].
dirty = QB_TRUE;
803 pthread_mutex_unlock (&logsys_config_mutex);
812 for (i = 0; prioritynames[i].
c_name != NULL; i++) {
813 if (strcasecmp(name, prioritynames[i].
c_name) == 0) {
814 return (prioritynames[i].
c_val);
825 err = qb_log_thread_start();
830 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, QB_TRUE);
832 if (logsys_loggers[i].target_id > 0) {
833 qb_log_ctl(logsys_loggers[i].target_id, QB_LOG_CONF_THREADED, QB_TRUE);
837 logsys_thread_started = 1;
#define LOGSYS_DEBUG_TRACE
#define LOGSYS_MAX_PERROR_MSG_LEN
char * logsys_format_get(void)
logsys_format_get
int logsys_config_debug_set(const char *subsys, unsigned int debug)
enabling debug, disable message priority filtering.
int logsys_config_mode_set(const char *subsys, unsigned int mode)
logsys_config_mode_set
int logsys_thread_start(void)
logsys_thread_start
#define LOGSYS_MAX_SUBSYS_NAMELEN
#define LOGSYS_PERROR(err_num, level, fmt, args...)
The LOGSYS_PERROR macro.
#define LOGSYS_MODE_OUTPUT_FILE
int logsys_config_logfile_priority_set(const char *subsys, unsigned int priority)
logsys_config_logfile_priority_set
int logsys_config_syslog_priority_set(const char *subsys, unsigned int priority)
logsys_config_syslog_priority_set
#define LOGSYS_LEVEL_WARNING
#define LOGSYS_MAX_SUBSYS_COUNT
void logsys_config_apply(void)
logsys_config_apply
int logsys_priority_id_get(const char *name)
logsys_priority_id_get
#define LOGSYS_LOGGER_NEEDS_INIT
char subsys[LOGSYS_MAX_SUBSYS_NAMELEN]
int logsys_config_file_set(const char *subsys, const char **error_string, const char *file)
to close a logfile, just invoke this function with a NULL file or if you want to change logfile...
#define LOGSYS_MODE_OUTPUT_SYSLOG
int logsys_format_set(const char *format)
configuration bits that can only be done for the whole system
void logsys_system_fini(void)
logsys_system_fini
#define MAX_FILES_PER_SUBSYS
unsigned int logsys_config_mode_get(const char *subsys)
logsys_config_mode_get
int logsys_config_syslog_facility_set(const char *subsys, unsigned int facility)
per system/subsystem settings.
#define LOGSYS_LOGGER_INIT_DONE
int _logsys_system_setup(const char *mainsystem, unsigned int mode, int syslog_facility, int syslog_priority)
_logsys_system_setup
int _logsys_subsys_create(const char *subsys, const char *filename)
_logsys_subsys_create
char * files[MAX_FILES_PER_SUBSYS]
#define LOGSYS_MODE_OUTPUT_STDERR
int _logsys_config_subsys_get(const char *subsys)
_logsys_config_subsys_get