64 {
"alert", LOG_ALERT },
66 {
"debug", LOG_DEBUG },
67 {
"emerg", LOG_EMERG },
71 {
"notice", LOG_NOTICE },
72 {
"warning", LOG_WARNING },
76#define MAX_FILES_PER_SUBSYS 32
77#ifdef HAVE_SMALL_MEMORY_FOOTPRINT
78#define IPC_LOGSYS_SIZE 8192*64
80#define IPC_LOGSYS_SIZE 8192*1024
102#define LOGSYS_LOGGER_INIT_DONE 0
103#define LOGSYS_LOGGER_NEEDS_INIT 1
109static pthread_mutex_t logsys_config_mutex = PTHREAD_MUTEX_INITIALIZER;
111static int32_t _logsys_config_mode_set_unlocked(int32_t subsysid, uint32_t new_mode);
112static void _logsys_config_apply_per_file(int32_t s,
const char *filename);
113static void _logsys_config_apply_per_subsys(int32_t s);
114static void _logsys_subsys_filename_add (int32_t s,
const char *filename);
115static void logsys_file_format_get(
char* file_format,
int buf_len);
117static char *format_buffer=NULL;
119static int logsys_thread_started = 0;
121static int logsys_blackbox_enabled = 1;
123static int _logsys_config_subsys_get_unlocked (
const char *
subsys)
145static int logsys_config_file_set_unlocked (
147 const char **error_string,
150 static char error_string_response[512];
152 char file_format[128];
154 if (logsys_loggers[subsysid].
target_id > 0) {
156 for (f = 0; f < logsys_loggers[subsysid].
file_idx; f++) {
157 qb_log_filter_ctl(logsys_loggers[subsysid].
target_id,
158 QB_LOG_FILTER_REMOVE,
160 logsys_loggers[subsysid].
files[f],
165 logsys_loggers[subsysid].
dirty = QB_TRUE;
170 if (logsys_loggers[subsysid].
target_id > 0 &&
171 logsys_loggers[subsysid].
logfile != NULL &&
172 strcmp(file, logsys_loggers[subsysid].
logfile) == 0) {
176 if (strlen(file) >= PATH_MAX) {
177 snprintf (error_string_response,
178 sizeof(error_string_response),
179 "%s: logfile name exceed maximum system filename length",
180 logsys_loggers[subsysid].
subsys);
181 *error_string = error_string_response;
185 if (logsys_loggers[subsysid].
logfile != NULL) {
186 free(logsys_loggers[subsysid].
logfile);
187 logsys_loggers[subsysid].
logfile = NULL;
190 logsys_loggers[subsysid].
logfile = strdup(file);
192 if (logsys_loggers[subsysid].
logfile == NULL) {
193 snprintf (error_string_response,
194 sizeof(error_string_response),
195 "Unable to allocate memory for logfile '%s'",
197 *error_string = error_string_response;
202 if ((logsys_loggers[i].
logfile != NULL) &&
203 (strcmp (logsys_loggers[i].
logfile, file) == 0) &&
213 if (logsys_loggers[subsysid].
target_id > 0) {
214 int num_using_current = 0;
216 if (logsys_loggers[subsysid].
target_id ==
221 if (num_using_current == 1) {
223 qb_log_file_close(logsys_loggers[subsysid].
target_id);
227 logsys_loggers[subsysid].
target_id = qb_log_file_open(file);
228 if (logsys_loggers[subsysid].
target_id < 0) {
229 int err = -logsys_loggers[subsysid].
target_id;
231 const char *error_ptr;
232 error_ptr = qb_strerror_r(err, error_str,
sizeof(error_str));
234 free(logsys_loggers[subsysid].
logfile);
235 logsys_loggers[subsysid].
logfile = NULL;
236 snprintf (error_string_response,
237 sizeof(error_string_response),
238 "Can't open logfile '%s' for reason: %s (%d)",
239 file, error_ptr, err);
240 *error_string = error_string_response;
243 logsys_file_format_get(file_format, 128);
244 qb_log_format_set(logsys_loggers[subsysid].
target_id, file_format);
246 qb_log_ctl(logsys_loggers[subsysid].
target_id,
249 if (logsys_thread_started) {
250 qb_log_ctl(logsys_loggers[subsysid].
target_id, QB_LOG_CONF_THREADED, QB_TRUE);
256static void logsys_subsys_init (
271 sizeof (logsys_loggers[subsysid].
subsys));
272 logsys_loggers[subsysid].
subsys[
273 sizeof (logsys_loggers[subsysid].
subsys) - 1] =
'\0';
274 logsys_loggers[subsysid].
file_idx = 0;
277static const char *_logsys_tags_stringify(uint32_t tags)
279 if (tags == QB_LOG_TAG_LIBQB_MSG) {
282 return logsys_loggers[tags].
subsys;
291 free(logsys_loggers[i].
logfile);
292 for (f = 0; f < logsys_loggers[i].
file_idx; f++) {
293 free(logsys_loggers[i].
files[f]);
305 const char *mainsystem,
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,
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);
379 qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_FALSE);
382 pthread_mutex_unlock (&logsys_config_mutex);
387 qb_log_tags_stringify_fn_set(_logsys_tags_stringify);
393 if ((strcmp (logsys_loggers[i].
subsys,
"") != 0) &&
397 strncpy (tempsubsys, logsys_loggers[i].
subsys,
398 sizeof (tempsubsys));
399 tempsubsys[
sizeof (tempsubsys) - 1] =
'\0';
400 logsys_subsys_init(tempsubsys, i);
402 _logsys_config_mode_set_unlocked(i, logsys_loggers[i].
mode);
403 _logsys_config_apply_per_subsys(i);
407 pthread_mutex_unlock (&logsys_config_mutex);
413static void _logsys_subsys_filename_add (int32_t s,
const char *filename)
417 if (filename == NULL) {
421 assert(logsys_loggers[s].
file_idx >= 0);
423 for (i = 0; i < logsys_loggers[s].
file_idx; i++) {
424 if (strcmp(logsys_loggers[s].
files[i], filename) == 0) {
428 logsys_loggers[s].
files[logsys_loggers[s].
file_idx++] = strdup(filename);
431 _logsys_config_apply_per_file(s, filename);
444 pthread_mutex_lock (&logsys_config_mutex);
446 i = _logsys_config_subsys_get_unlocked (
subsys);
448 _logsys_subsys_filename_add(i, filename);
449 pthread_mutex_unlock (&logsys_config_mutex);
454 if (strcmp (logsys_loggers[i].
subsys,
"") == 0) {
455 logsys_subsys_init(
subsys, i);
456 _logsys_subsys_filename_add(i, filename);
465 pthread_mutex_unlock (&logsys_config_mutex);
473 pthread_mutex_lock (&logsys_config_mutex);
475 i = _logsys_config_subsys_get_unlocked (
subsys);
477 pthread_mutex_unlock (&logsys_config_mutex);
482static int32_t _logsys_config_mode_set_unlocked(int32_t subsysid, uint32_t new_mode)
484 if ( logsys_loggers[subsysid].
mode == new_mode) {
487 if (logsys_loggers[subsysid].
target_id > 0) {
488 qb_log_ctl(logsys_loggers[subsysid].
target_id,
494 qb_log_ctl(QB_LOG_STDERR,
497 qb_log_ctl(QB_LOG_SYSLOG,
501 logsys_loggers[subsysid].
mode = new_mode;
509 pthread_mutex_lock (&logsys_config_mutex);
511 i = _logsys_config_subsys_get_unlocked (
subsys);
513 i = _logsys_config_mode_set_unlocked(i,
mode);
517 _logsys_config_mode_set_unlocked(i,
mode);
522 pthread_mutex_unlock (&logsys_config_mutex);
536 return logsys_loggers[i].
mode;
541 const char **error_string,
547 pthread_mutex_lock (&logsys_config_mutex);
550 i = _logsys_config_subsys_get_unlocked (
subsys);
554 res = logsys_config_file_set_unlocked(i, error_string, file);
558 res = logsys_config_file_set_unlocked(i, error_string, file);
565 pthread_mutex_unlock (&logsys_config_mutex);
570logsys_file_format_get(
char* file_format,
int buf_len)
572 char *format_buffer_start;
575 file_format[0] =
'\0';
577 format_buffer_start = format_buffer;
579 if ((str_pos = strstr(format_buffer,
"%t"))) {
580 strcpy(file_format,
"%t ");
581 format_buffer_start = str_pos + 2;
584 if ((str_pos = strstr(format_buffer,
"%T"))) {
585 strcpy(file_format,
"%T ");
586 format_buffer_start = str_pos + 2;
589 strcat(file_format,
"[%P] %H %N");
590 strncat(file_format, format_buffer_start, buf_len - strlen(file_format));
599 char syslog_format[128];
600 char file_format[128];
604 format_buffer = NULL;
607 format_buffer = strdup(format ? format :
"%7p [%6g] %b");
608 if (format_buffer == NULL) {
612 qb_log_format_set(QB_LOG_STDERR, format_buffer);
614 logsys_file_format_get(file_format, 128);
617 qb_log_format_set(logsys_loggers[i].
target_id, file_format);
626 memset(syslog_format,
'\0',
sizeof(syslog_format));
627 for (c = 0; c < strlen(format_buffer); c++) {
628 if (format_buffer[c] ==
'%') {
630 for (c++; c < strlen(format_buffer); c++) {
631 if (isdigit(format_buffer[c])) {
634 if (format_buffer[c] ==
't' ||
635 format_buffer[c] ==
'p' ||
636 format_buffer[c] ==
'T') {
644 syslog_format[w] = format_buffer[c];
647 qb_log_format_set(QB_LOG_SYSLOG, syslog_format);
654 return format_buffer;
659 unsigned int facility)
661 return qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_FACILITY, facility);
666 unsigned int priority)
670 pthread_mutex_lock (&logsys_config_mutex);
672 i = _logsys_config_subsys_get_unlocked (
subsys);
675 logsys_loggers[i].
dirty = QB_TRUE;
682 logsys_loggers[i].
dirty = QB_TRUE;
686 pthread_mutex_unlock (&logsys_config_mutex);
693 unsigned int priority)
697 pthread_mutex_lock (&logsys_config_mutex);
699 i = _logsys_config_subsys_get_unlocked (
subsys);
702 logsys_loggers[i].
dirty = QB_TRUE;
708 logsys_loggers[i].
dirty = QB_TRUE;
712 pthread_mutex_unlock (&logsys_config_mutex);
718static void _logsys_config_apply_per_file(int32_t s,
const char *filename)
723 qb_log_filter_ctl(s, QB_LOG_TAG_SET, QB_LOG_FILTER_FILE,
724 filename, LOG_TRACE);
726 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_REMOVE,
727 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
728 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_REMOVE,
729 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
731 qb_log_filter_ctl(logsys_loggers[s].
target_id,
732 QB_LOG_FILTER_REMOVE,
733 QB_LOG_FILTER_FILE, filename, LOG_TRACE);
737 switch (logsys_loggers[s].
debug) {
750 qb_log_filter_ctl(QB_LOG_SYSLOG, QB_LOG_FILTER_ADD,
751 QB_LOG_FILTER_FILE, filename,
753 qb_log_filter_ctl(QB_LOG_STDERR, QB_LOG_FILTER_ADD,
754 QB_LOG_FILTER_FILE, filename,
757 qb_log_filter_ctl(logsys_loggers[s].
target_id,
759 QB_LOG_FILTER_FILE, filename,
764static void _logsys_config_apply_per_subsys(int32_t s)
767 for (f = 0; f < logsys_loggers[s].
file_idx; f++) {
768 _logsys_config_apply_per_file(s, logsys_loggers[s].
files[f]);
775 logsys_loggers[s].
dirty = QB_FALSE;
778static void _logsys_config_apply_blackbox(
void) {
779 int blackbox_enable_res;
781 blackbox_enable_res = qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, logsys_blackbox_enabled);
783 if (blackbox_enable_res < 0) {
785 "Unable to initialize log flight recorder. "\
786 "The most common cause of this error is " \
787 "not enough space on /dev/shm. Corosync will continue work, " \
788 "but blackbox will not be available");
796 _logsys_config_apply_blackbox();
799 if (strcmp(logsys_loggers[s].
subsys,
"") == 0) {
802 _logsys_config_apply_per_subsys(s);
809 int debug_level = logsys_loggers[0].
debug;
813 pthread_mutex_lock (&logsys_config_mutex);
814 i = _logsys_config_subsys_get_unlocked (
subsys);
816 debug_level = logsys_loggers[i].
debug;
818 pthread_mutex_unlock (&logsys_config_mutex);
829 pthread_mutex_lock (&logsys_config_mutex);
831 i = _logsys_config_subsys_get_unlocked (
subsys);
833 logsys_loggers[i].
dirty = QB_TRUE;
840 logsys_loggers[i].
dirty = QB_TRUE;
844 pthread_mutex_unlock (&logsys_config_mutex);
853 for (i = 0; prioritynames[i].
c_name != NULL; i++) {
854 if (strcasecmp(name, prioritynames[i].c_name) == 0) {
855 return (prioritynames[i].c_val);
866 err = qb_log_thread_start();
871 qb_log_ctl(QB_LOG_SYSLOG, QB_LOG_CONF_THREADED, QB_TRUE);
874 qb_log_ctl(logsys_loggers[i].
target_id, QB_LOG_CONF_THREADED, QB_TRUE);
878 logsys_thread_started = 1;
886 pthread_mutex_lock (&logsys_config_mutex);
888 logsys_blackbox_enabled = enable;
890 pthread_mutex_unlock (&logsys_config_mutex);
900 (void)qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_ENABLED, QB_FALSE);
906 _logsys_config_apply_blackbox();
913#ifdef HAVE_QB_LOG_FILE_REOPEN
915 int num_using_current;
920 pthread_mutex_lock (&logsys_config_mutex);
923 if (logsys_loggers[i].
target_id <= 0 || logsys_loggers[i].
logfile == NULL) {
927 num_using_current = 0;
928 for (j = 0; j <= i; j++) {
933 if (num_using_current == 1) {
937 rc = qb_log_file_reopen(logsys_loggers[i].
target_id, NULL);
940 "Unable to reopen log file %s", logsys_loggers[i].
logfile);
946 pthread_mutex_unlock (&logsys_config_mutex);
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
cs_error_t
The cs_error_t enum.
unsigned int logsys_config_mode_get(const char *subsys)
logsys_config_mode_get
int logsys_config_mode_set(const char *subsys, unsigned int mode)
logsys_config_mode_set
void logsys_blackbox_set(int enable)
void logsys_blackbox_prefork(void)
void logsys_system_fini(void)
logsys_system_fini
char * logsys_format_get(void)
logsys_format_get
int logsys_config_debug_get(const char *subsys)
Return the debug flag for this subsys.
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,...
int logsys_config_syslog_priority_set(const char *subsys, unsigned int priority)
logsys_config_syslog_priority_set
void logsys_config_apply(void)
logsys_config_apply
int logsys_priority_id_get(const char *name)
logsys_priority_id_get
#define LOGSYS_LOGGER_INIT_DONE
int logsys_config_logfile_priority_set(const char *subsys, unsigned int priority)
logsys_config_logfile_priority_set
int logsys_thread_start(void)
logsys_thread_start
int logsys_config_debug_set(const char *subsys, unsigned int debug)
enabling debug, disable message priority filtering.
int _logsys_config_subsys_get(const char *subsys)
_logsys_config_subsys_get
int _logsys_subsys_create(const char *subsys, const char *filename)
_logsys_subsys_create
int logsys_config_syslog_facility_set(const char *subsys, unsigned int facility)
per system/subsystem settings.
cs_error_t logsys_reopen_log_files(void)
#define MAX_FILES_PER_SUBSYS
void logsys_blackbox_postfork(void)
int _logsys_system_setup(const char *mainsystem, unsigned int mode, int syslog_facility, int syslog_priority)
_logsys_system_setup
int logsys_format_set(const char *format)
configuration bits that can only be done for the whole system
#define LOGSYS_LOGGER_NEEDS_INIT
#define LOGSYS_MAX_SUBSYS_NAMELEN
#define LOGSYS_MODE_OUTPUT_STDERR
#define LOGSYS_DEBUG_TRACE
#define LOGSYS_PERROR(err_num, level, fmt, args...)
The LOGSYS_PERROR macro.
#define LOGSYS_LEVEL_WARNING
#define LOGSYS_MAX_PERROR_MSG_LEN
#define LOGSYS_MODE_OUTPUT_FILE
#define LOGSYS_MODE_OUTPUT_SYSLOG
#define LOGSYS_MAX_SUBSYS_COUNT
char * files[MAX_FILES_PER_SUBSYS]
char subsys[LOGSYS_MAX_SUBSYS_NAMELEN]