[Openais] Make it possible to adjust the log priority and tags at runtime.
Angus & Anna Salkeld
ahsalkeld at gmail.com
Thu Oct 23 01:54:39 PDT 2008
This patch allows you to use confdb to set the following objects at runtime:
logging {
subsys {
priority: debug
tags: trace1|trace5
}
}
Note:
-this needs to be on top of syslogv2
-the change from syslog_level (not actually used) to priority.
Regards
Angus
conf/corosync.conf | 3 +-
exec/logsys.c | 36 +++++++++++
exec/mainconfig.c | 119 ++++++++++++++++++++++---------------
include/corosync/engine/logsys.h | 3 +
lib/Makefile | 2 +
man/corosync.conf.5 | 16 ++----
services/confdb.c | 8 +-
tools/Makefile | 7 +-
tools/corosync-objctl.c | 2 +-
9 files changed, 127 insertions(+), 69 deletions(-)
diff --git a/conf/corosync.conf b/conf/corosync.conf
index 0e2bdf4..3b5fc79 100644
--- a/conf/corosync.conf
+++ b/conf/corosync.conf
@@ -17,11 +17,10 @@ logging {
to_file: yes
to_syslog: yes
logfile: /tmp/corosync.log
- debug: off
timestamp: on
logger {
ident: AMF
- debug: off
+ priority: info
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
}
}
diff --git a/exec/logsys.c b/exec/logsys.c
index 7f4c499..15f11f2 100644
--- a/exec/logsys.c
+++ b/exec/logsys.c
@@ -246,6 +246,42 @@ static inline int strcpy_cutoff (char *dest, char
*src, int cutoff)
return (cutoff);
}
+unsigned int logsys_trace_mask_get (const char *config)
+{
+ char trace_buf[256];
+ char * token;
+ unsigned int tags = 0;
+
+ strncpy (trace_buf, config, 256);
+ token = strtok (trace_buf, "|");
+
+ while (token != NULL) {
+ if (strcmp (token, "enter") == 0) {
+ tags |= LOGSYS_TAG_ENTER;
+ } else if (strcmp (token, "leave") == 0) {
+ tags |= LOGSYS_TAG_LEAVE;
+ } else if (strcmp (token, "trace1") == 0) {
+ tags |= LOGSYS_TAG_TRACE1;
+ } else if (strcmp (token, "trace2") == 0) {
+ tags |= LOGSYS_TAG_TRACE2;
+ } else if (strcmp (token, "trace3") == 0) {
+ tags |= LOGSYS_TAG_TRACE3;
+ } else if (strcmp (token, "trace4") == 0) {
+ tags |= LOGSYS_TAG_TRACE4;
+ } else if (strcmp (token, "trace5") == 0) {
+ tags |= LOGSYS_TAG_TRACE5;
+ } else if (strcmp (token, "trace6") == 0) {
+ tags |= LOGSYS_TAG_TRACE6;
+ } else if (strcmp (token, "trace7") == 0) {
+ tags |= LOGSYS_TAG_TRACE7;
+ } else if (strcmp (token, "trace8") == 0) {
+ tags |= LOGSYS_TAG_TRACE8;
+ }
+
+ token = strtok(NULL, "|");
+ }
+ return tags;
+}
/*
* %s SUBSYSTEM
* %n FUNCTION NAME
diff --git a/exec/mainconfig.c b/exec/mainconfig.c
index 35c384a..9a4bb5c 100644
--- a/exec/mainconfig.c
+++ b/exec/mainconfig.c
@@ -98,6 +98,63 @@ static struct logsys_config_struct {
unsigned int tags;
} logsys_logger;
+
+void logcfg_object_key_changed (
+ object_change_type_t change_type,
+ unsigned int parent_object_handle,
+ unsigned int object_handle,
+ void *object_name_pt, int object_name_len,
+ void *key_name_pt, int key_len,
+ void *key_value_pt, int key_value_len,
+ void *priv_data_pt)
+{
+ char *value;
+ int subsys_id;
+ unsigned int tags;
+ unsigned int priority;
+ struct objdb_iface_ver0 *objdb = priv_data_pt;
+
+ if (strncmp (object_name_pt, "logger_subsys", 13) == 0) {
+
+ /* get the subsys field, if we can't then it's a new field
+ * so wait until it's created.
+ */
+ if (!objdb_get_string (objdb, object_handle, "subsys", &value)) {
+ subsys_id = logsys_config_subsys_get (value, &tags, &priority);
+ if (subsys_id == -1) {
+ /* log this incorrect config */
+ return;
+ }
+ } else {
+ /* not created yet. */
+ return;
+ }
+
+ if (strncmp (key_name_pt, "priority", 8) == 0) {
+ if (change_type == OBJECT_KEY_DELETED) {
+ /* restore some sensible default */
+ priority = LOG_LEVEL_NOTICE;
+ } else {
+ priority = logsys_priority_id_get (key_value_pt);
+ if (priority == -1) {
+ return;
+ }
+ }
+ logsys_config_subsys_set (value, tags, priority);
+
+ } else if (strncmp (key_name_pt, "tags", 4) == 0) {
+ if (change_type == OBJECT_KEY_DELETED) {
+ /* restore some sensible default */
+ tags = 0;
+ } else {
+ tags = logsys_trace_mask_get (key_value_pt);
+ }
+ logsys_config_subsys_set (value, tags, priority);
+ }
+ }
+}
+
+
int corosync_main_config_read (
struct objdb_iface_ver0 *objdb,
char **error_string,
@@ -109,7 +166,7 @@ int corosync_main_config_read (
char *error_reason = error_string_response;
unsigned int object_find_handle;
unsigned int object_find_logsys_handle;
- int global_debug = 0;
+ int priority;
memset (main_config, 0, sizeof (struct main_config));
@@ -120,6 +177,12 @@ int corosync_main_config_read (
strlen ("logging"),
&object_find_handle);
+
+ objdb->object_track_start (object_find_handle,
+ OBJECT_TRACK_DEPTH_RECURSIVE,
+ logcfg_object_key_changed,
+ NULL, NULL, NULL, objdb);
+
main_config->logmode = LOG_MODE_THREADED | LOG_MODE_FORK;
if (objdb->object_find_next (
object_find_handle,
@@ -150,16 +213,6 @@ int corosync_main_config_read (
}
}
- if (!objdb_get_string (objdb,object_service_handle, "debug", &value)) {
- if (strcmp (value, "on") == 0) {
- global_debug = 1;
- } else
- if (strcmp (value, "off") == 0) {
- global_debug = 0;
- } else {
- goto parse_error;
- }
- }
if (!objdb_get_string (objdb,object_service_handle, "timestamp", &value)) {
/* todo change format string
if (strcmp (value, "on") == 0) {
@@ -241,47 +294,17 @@ int corosync_main_config_read (
error_reason = "subsys required for logger directive";
goto parse_error;
}
- if (!objdb_get_string (objdb, object_logger_subsys_handle,
"debug", &value)) {
- if (strcmp (value, "on") == 0) {
- logsys_logger.priority = LOG_LEVEL_DEBUG;
- } else
- if (strcmp (value, "off") == 0) {
- logsys_logger.priority &= ~LOG_LEVEL_DEBUG;
- } else {
+
+ if (!objdb_get_string (objdb, object_logger_subsys_handle,
"priority", &value)) {
+ priority = logsys_priority_id_get (value);
+ if (priority == -1) {
+ error_reason = "invalid priority";
goto parse_error;
}
+ logsys_logger.priority = priority;
}
if (!objdb_get_string (objdb, object_logger_subsys_handle, "tags",
&value)) {
- char *token = strtok (value, "|");
-
- while (token != NULL) {
- if (strcmp (token, "enter") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_ENTER;
- } else if (strcmp (token, "leave") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_LEAVE;
- } else if (strcmp (token, "trace1") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE1;
- } else if (strcmp (token, "trace2") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE2;
- } else if (strcmp (token, "trace3") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE3;
- } else if (strcmp (token, "trace4") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE4;
- } else if (strcmp (token, "trace5") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE5;
- } else if (strcmp (token, "trace6") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE6;
- } else if (strcmp (token, "trace7") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE7;
- } else if (strcmp (token, "trace8") == 0) {
- logsys_logger.tags |= LOGSYS_TAG_TRACE8;
- } else {
- error_reason = "bad tags value";
- goto parse_error;
- }
-
- token = strtok(NULL, "|");
- }
+ logsys_logger.tags = logsys_trace_mask_get (value);
}
/*
* set individual logger configurations
diff --git a/include/corosync/engine/logsys.h b/include/corosync/engine/logsys.h
index 4361f1d..b1ee436 100644
--- a/include/corosync/engine/logsys.h
+++ b/include/corosync/engine/logsys.h
@@ -136,6 +136,9 @@ extern const char *logsys_priority_name_get (
extern void logsys_fork_completed (void);
+extern unsigned int logsys_trace_mask_get (
+ const char *config);
+
extern void logsys_flush (void);
extern void logsys_atsegv (void);
diff --git a/lib/Makefile b/lib/Makefile
index 7f623dc..7971848 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -44,6 +44,8 @@ all: libcpg.a libcpg.so.2.0.0 \
libquorum.a libquorum.so.2.0.0 \
libcoroutil.a libcoroutil.so.2.0.0
+LIBAIS_SRC=cfg.c confdb.c cpg.c evs.c sa-confdb.c util.c
+
libcoroutil.a: util.o
$(AR) -rc libcoroutil.a util.o
diff --git a/man/corosync.conf.5 b/man/corosync.conf.5
index c915b09..2912dd0 100644
--- a/man/corosync.conf.5
+++ b/man/corosync.conf.5
@@ -472,23 +472,17 @@ name used by a service in the log_init () call.
E.g. 'CKPT'. This directive is
required.
.TP
-debug
-This specifies whether debug output is logged for this particular logger.
-
-The default is off.
-
-.TP
-syslog_level
-This specifies the syslog level for this particular subsystem.
Ignored if debug is on.
-Possible values are: alert, crit, debug (same as debug = on), emerg,
err, info, notice, warning.
+priority
+This specifies the syslog priority for this particular subsystem.
+Possible values are: alert, crit, debug, emerg, err, info, notice, warning.
The default is: info.
.TP
tags
This specifies which tags should be traced for this particular logger.
-Set debug directive to
-.B on
+Set priority directive to
+.B debug
in order to enable tracing using tags.
Values are specified using a vertical bar as a logical OR separator:
diff --git a/services/confdb.c b/services/confdb.c
index d59c184..053ec56 100644
--- a/services/confdb.c
+++ b/services/confdb.c
@@ -49,7 +49,7 @@
#include <corosync/engine/logsys.h>
#include <corosync/engine/coroapi.h>
-LOGSYS_DECLARE_SUBSYS ("CONFDB", LOG_DEBUG);
+LOGSYS_DECLARE_SUBSYS ("CONFDB", LOG_INFO);
static struct corosync_api_v1 *api;
@@ -268,13 +268,13 @@ static int confdb_exec_init_fn (
static int confdb_lib_init_fn (void *conn)
{
- log_printf(LOG_LEVEL_DEBUG, "lib_init_fn: conn=%p\n", conn);
+ ENTER();
return (0);
}
static int confdb_lib_exit_fn (void *conn)
{
- log_printf(LOG_LEVEL_DEBUG, "exit_fn for conn=%p\n", conn);
+ ENTER();
/* cleanup the object trackers for this client. */
api->object_track_stop(confdb_notify_lib_of_key_change,
confdb_notify_lib_of_new_object,
@@ -325,7 +325,7 @@ static void
message_handler_req_lib_confdb_object_find_destroy (void *conn, void
mar_res_header_t res;
int ret = SA_AIS_OK;
- log_printf(LOG_LEVEL_DEBUG, "object_find_destroy for conn=%p, %d\n",
conn, req_lib_confdb_object_find_destroy->find_handle);
+ ENTER();
if (api->object_find_destroy(req_lib_confdb_object_find_destroy->find_handle))
ret = SA_AIS_ERR_ACCESS;
diff --git a/tools/Makefile b/tools/Makefile
index 30ed173..4242adb 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -33,7 +33,8 @@
# Include configuration
#
srcdir ?= $(CURDIR)/../
-subdir ?= apps/
+subdir ?= tools/
+
include $(srcdir)Makefile.inc
@@ -43,7 +44,7 @@ endif
LIBS = ../lib/libconfdb.a ../lib/libcfg.a
BINARIES=corosync-objctl corosync-cfgtool corosync-keygen corosync-fplay
-APPS_SRC=$(addsuffix .c,$(BINARIES))
+TOOLS_SRC=$(addsuffix .c,$(BINARIES))
EXTRA_CFLAGS = -I$(srcdir)include
all: $(BINARIES)
@@ -67,4 +68,4 @@ clean:
$(CC) $(CFLAGS) $(CPPFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
depend:
- makedepend -Y -- $(CFLAGS) $(CPPFLAGS) $(APPS_SRC) > /dev/null 2>&1
+ makedepend -Y -- $(CFLAGS) $(CPPFLAGS) $(TOOLS_SRC) > /dev/null 2>&1
diff --git a/tools/corosync-objctl.c b/tools/corosync-objctl.c
index e6106ad..332ffa3 100644
--- a/tools/corosync-objctl.c
+++ b/tools/corosync-objctl.c
@@ -261,7 +261,7 @@ static confdb_error_t find_object (confdb_handle_t handle,
uint32_t obj_handle;
confdb_handle_t parent_object_handle = OBJECT_PARENT_HANDLE;
char tmp_name[OBJ_NAME_SIZE];
- confdb_error_t res;
+ confdb_error_t res = CONFDB_OK;
strncpy (tmp_name, name_pt, OBJ_NAME_SIZE);
obj_name_pt = strtok_r(tmp_name, SEPERATOR_STR, &save_pt);
--
1.6.0.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Make-it-possible-to-adjust-the-log-priority-at-runti.patch
Type: application/octet-stream
Size: 12056 bytes
Desc: not available
Url : http://lists.linux-foundation.org/pipermail/openais/attachments/20081023/acf54526/attachment-0001.obj
More information about the Openais
mailing list