[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