[PATCH] wayland: introduce logging with syslog

Tiago Vignatti tiago.vignatti at intel.com
Fri Jul 22 13:01:51 PDT 2011


Three level of messages are possible, which are sent to syslog: WL_INFO,
WL_WARNING and WL_ERROR; the last two are printed also to stderr due
sanity. The only interface for the compositor and clients is

    void wl_log(int level, const char *f, ...);

It requires a small intervention on the system configuration and
assumption that LOG_LOCAL0 routes for wayland logging. So in MeeGo for
instance, there is sysklogd package which provides syslogd and I had to
edit /etc/syslog.conf, adding a line like this:

    local0.*    /var/log/wayland.log

then I (re-)started the daemon:

    systemd

Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
 wayland/wayland-client.c |    3 +++
 wayland/wayland-server.c |    3 +++
 wayland/wayland-util.c   |   36 ++++++++++++++++++++++++++++++++++++
 wayland/wayland-util.h   |   14 ++++++++++++++
 4 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/wayland/wayland-client.c b/wayland/wayland-client.c
index 9d1f66b..728fa22 100644
--- a/wayland/wayland-client.c
+++ b/wayland/wayland-client.c
@@ -369,6 +369,8 @@ wl_display_connect(const char *name)
 	if (debug)
 		wl_debug = 1;
 
+	wl_log_open("client");
+
 	display = malloc(sizeof *display);
 	if (display == NULL)
 		return NULL;
@@ -441,6 +443,7 @@ wl_display_destroy(struct wl_display *display)
 
 	close(display->fd);
 	free(display);
+	wl_log_close();
 }
 
 WL_EXPORT int
diff --git a/wayland/wayland-server.c b/wayland/wayland-server.c
index 2019cb4..6285708 100644
--- a/wayland/wayland-server.c
+++ b/wayland/wayland-server.c
@@ -589,6 +589,8 @@ wl_display_create(void)
 	if (debug)
 		wl_debug = 1;
 
+	wl_log_open("compositor");
+
 	display = malloc(sizeof *display);
 	if (display == NULL)
 		return NULL;
@@ -647,6 +649,7 @@ wl_display_destroy(struct wl_display *display)
 		free(global);
 
 	free(display);
+	wl_log_close();
 }
 
 WL_EXPORT void
diff --git a/wayland/wayland-util.c b/wayland/wayland-util.c
index 3643274..a28530c 100644
--- a/wayland/wayland-util.c
+++ b/wayland/wayland-util.c
@@ -121,3 +121,39 @@ wl_array_copy(struct wl_array *array, struct wl_array *source)
 	wl_array_add(array, source->size);
 	memcpy(array->data, source->data, source->size);
 }
+
+void
+wl_log_open(const char *ident)
+{
+	setlogmask (LOG_UPTO (LOG_INFO));
+	openlog (ident, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_LOCAL0);
+}
+
+void
+wl_log_close(void)
+{
+	closelog();
+}
+
+WL_EXPORT void
+wl_log(int level, const char *f, ...)
+{
+	va_list args;
+	va_start(args, f);
+
+	/* WL_WARNING and WL_ERROR go to stderr output as well */
+	switch(level) {
+	case WL_INFO:
+		vsyslog(LOG_INFO, f, args);
+		break;
+	case WL_WARNING:
+		vsyslog(LOG_WARNING, f, args);
+		vfprintf(stderr, f, args);
+		break;
+	case WL_ERROR:
+		vsyslog(LOG_ERR, f, args);
+		vfprintf(stderr, f, args);
+		break;
+	}
+	va_end(args);
+}
diff --git a/wayland/wayland-util.h b/wayland/wayland-util.h
index a9f869a..63a32f0 100644
--- a/wayland/wayland-util.h
+++ b/wayland/wayland-util.h
@@ -28,6 +28,9 @@ extern "C" {
 #endif
 
 #include <inttypes.h>
+#include <syslog.h>
+#include <stdio.h>
+#include <stdarg.h>
 
 /* GCC visibility */
 #if defined(__GNUC__) && __GNUC__ >= 4
@@ -145,6 +148,17 @@ void wl_array_release(struct wl_array *array);
 void *wl_array_add(struct wl_array *array, int size);
 void wl_array_copy(struct wl_array *array, struct wl_array *source);
 
+/**
+ * logging mechanism
+ */
+#define WL_INFO 0
+#define WL_WARNING 1
+#define WL_ERROR 2
+
+void wl_log_open(const char *ident);
+void wl_log_close(void);
+void wl_log(int level, const char *f, ...);
+
 #ifdef  __cplusplus
 }
 #endif
-- 
1.7.2.2



More information about the wayland-devel mailing list