From: Gihan Munasinghe <GMunasinghe@flexiant.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [PATCH] syslog support to xentoollog
Date: Sat, 05 Jun 2010 01:51:28 +0100 [thread overview]
Message-ID: <4C099F90.3080205@flexiant.com> (raw)
In-Reply-To: <19464.58055.990300.132491@mariner.uk.xensource.com>
[-- Attachment #1: Type: text/plain, Size: 1427 bytes --]
Guys
See the attach patch, this implements a xentoollog consumer that can log
in to syslog
Following are the changes
xentoollog.h:
1) Generic, xtl_logger_set_minlevel and xtl_logger_adjust_flags
functions to be called from outside,
2) Making logger flags to be more generic
3) Change the struct xentool_logger, each logger will implement its own
"set_minlevel" and "adjust_flags" which will be invoked by
xtl_logger_set_minlevel and xtl_logger_adjust_flags generic functions.
4) New function prototype to create a xentool_logger_syslogger
Going forward I would like to suggest that xentoollog.h file should only
have generic functions, except for xtl_createlogger_* functions. Logger
type specific function should not be included(e.g
xtl_stdiostream_set_minlevel ) this will make sure outside code can
switch from one logger to another (from stdiologger to syslogger vice
versa) with out breaking the code.
xtl_core.c:
1) Implementation of xtl_logger_set_minlevel and xtl_logger_adjust_flags
functions.
xtl_logger_syslog.c :
New logger implementation to log in to syslog.
I did some testing by changing the code in xl. This seems to work, but I
would really like if more people can test this.
Also could someone look @ the syslogger_progress function and add any
extra bits if needed, I did a very basic implementation of this.
Signed-off-by : Gihan Munasinghe <GMunasinghe@flexiant.com>
Thanks
Gihan
[-- Attachment #2: xen4-xentoollog-syslog --]
[-- Type: text/plain, Size: 11271 bytes --]
diff -Nuar a/tools/libxc/Makefile b/tools/libxc/Makefile
--- a/tools/libxc/Makefile 2010-06-01 23:32:43.000000000 +0100
+++ b/tools/libxc/Makefile 2010-06-03 22:56:42.000000000 +0100
@@ -29,6 +29,7 @@
CTRL_SRCS-y += xc_memshr.c
CTRL_SRCS-y += xtl_core.c
CTRL_SRCS-y += xtl_logger_stdio.c
+CTRL_SRCS-y += xtl_logger_syslog.c
CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c
CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c
CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c
diff -Nuar a/tools/libxc/xentoollog.h b/tools/libxc/xentoollog.h
--- a/tools/libxc/xentoollog.h 2010-06-01 23:32:43.000000000 +0100
+++ b/tools/libxc/xentoollog.h 2010-06-04 22:49:54.000000000 +0100
@@ -45,16 +45,28 @@
* will always be called with done==0 for each new
* context/doing_what */;
void (*destroy)(struct xentoollog_logger *logger);
+ void (*set_minlevel)(xentoollog_logger *logger,
+ xentoollog_level min_level);
+ void (*adjust_flags)(xentoollog_logger *logger,
+ unsigned set_flags, unsigned clear_flags);
/* each logger can put its necessary data here */
+
};
/*---------- facilities for consuming log messages ----------*/
+//-- Should be depricated not generic enough --//
#define XTL_STDIOSTREAM_SHOW_PID 01u
#define XTL_STDIOSTREAM_SHOW_DATE 02u
#define XTL_STDIOSTREAM_HIDE_PROGRESS 04u
+//---Plase use the following as the new flags when creating and setting loggers
+#define XTL_SHOW_PID 01u
+#define XTL_SHOW_DATE 02u
+#define XTL_HIDE_PROGRESS 04u
+
+
typedef struct xentoollog_logger_stdiostream xentoollog_logger_stdiostream;
xentoollog_logger_stdiostream *xtl_createlogger_stdiostream
@@ -62,15 +74,47 @@
/* may return 0 if malloc fails, in which case error was logged */
/* destroy on this logger does not close the file */
+//This method need to be depricated use more generic xtl_logger_set_minlevel method insted
void xtl_stdiostream_set_minlevel(xentoollog_logger_stdiostream*,
xentoollog_level min_level);
+
+//This method need to be depricated use more generic xtl_logger_adjust_flags method insted.
void xtl_stdiostream_adjust_flags(xentoollog_logger_stdiostream*,
unsigned set_flags, unsigned clear_flags);
/* if set_flags and clear_flags overlap, set_flags takes precedence */
+
+typedef struct xentoollog_logger_syslogger xentoollog_logger_syslogger;
+
+/**
+Create a logger that will log to syslog
+syslog_facility is the facilities that are in the sys/syslog.h
+edit /etc/syslog.conf file to indicate where you wansyslog to send log data
+
+example config:-
+Add the following line in to /etc/syslog.conf
+
+local1.* /var/log/xenlog
+restart syslogd
+When setting up the logger give LOG_LOCAL1 as the logging facility
+now all your logs will appear in /var/log/xenlog file
+
+Please look more in to syslog and syslogng configs if you want to send the data in to remote logging servers
+
+NOTE: XTL_SHOW_DATE flag will not take any effect as syslogd will put the date by default
+**/
+xentoollog_logger_syslogger *xtl_createlogger_syslogger
+ (int syslog_facility, xentoollog_level min_level, unsigned flags);
+
void xtl_logger_destroy(struct xentoollog_logger *logger /* 0 is ok */);
+void xtl_logger_set_minlevel(struct xentoollog_logger *logger,xentoollog_level min_level);
+
+void xtl_logger_adjust_flags(struct xentoollog_logger *logger,
+ unsigned set_flags, unsigned clear_flags);
+
+
/*---------- facilities for generating log messages ----------*/
void xtl_logv(struct xentoollog_logger *logger,
@@ -104,6 +148,8 @@
(buffer).vtable.vmessage = LOGGER##_vmessage; \
(buffer).vtable.progress = LOGGER##_progress; \
(buffer).vtable.destroy = LOGGER##_destroy; \
+ (buffer).vtable.set_minlevel = LOGGER##_set_minlevel; \
+ (buffer).vtable.adjust_flags = LOGGER##_adjust_flags; \
\
new_consumer = malloc(sizeof(*new_consumer)); \
if (!new_consumer) { \
diff -Nuar a/tools/libxc/xtl_core.c b/tools/libxc/xtl_core.c
--- a/tools/libxc/xtl_core.c 2010-06-01 23:32:43.000000000 +0100
+++ b/tools/libxc/xtl_core.c 2010-06-04 21:34:55.000000000 +0100
@@ -63,7 +63,23 @@
logger->progress(logger, context, doing_what, percent, done, total);
}
+void xtl_logger_set_minlevel(struct xentoollog_logger *logger,
+ xentoollog_level min_level){
+ if (!logger || !logger->set_minlevel) return;
+
+ logger->set_minlevel(logger,min_level);
+}
+
+void xtl_logger_adjust_flags(struct xentoollog_logger *logger,
+ unsigned set_flags, unsigned clear_flags){
+ if (!logger || !logger->adjust_flags) return;
+
+ logger->adjust_flags(logger,set_flags,clear_flags);
+}
+
+
void xtl_logger_destroy(struct xentoollog_logger *logger) {
- if (!logger) return;
+ if (!logger || !logger->destroy) return;
+
logger->destroy(logger);
}
diff -Nuar a/tools/libxc/xtl_logger_stdio.c b/tools/libxc/xtl_logger_stdio.c
--- a/tools/libxc/xtl_logger_stdio.c 2010-06-01 23:32:43.000000000 +0100
+++ b/tools/libxc/xtl_logger_stdio.c 2010-06-04 21:44:52.000000000 +0100
@@ -124,6 +124,20 @@
lg->flags = new_flags;
}
+static void stdiostream_set_minlevel(struct xentoollog_logger *logger_in,
+ xentoollog_level min_level){
+
+ xentoollog_logger_stdiostream *lg = (void*)logger_in;
+ xtl_stdiostream_set_minlevel(lg,min_level);
+}
+
+static void stdiostream_adjust_flags(struct xentoollog_logger *logger_in,
+ unsigned set_flags, unsigned clear_flags) {
+
+ xentoollog_logger_stdiostream *lg = (void*)logger_in;
+ xtl_stdiostream_adjust_flags(lg,set_flags,clear_flags);
+}
+
xentoollog_logger_stdiostream *xtl_createlogger_stdiostream
(FILE *f, xentoollog_level min_level, unsigned flags) {
xentoollog_logger_stdiostream newlogger;
diff -Nuar a/tools/libxc/xtl_logger_syslog.c b/tools/libxc/xtl_logger_syslog.c
--- a/tools/libxc/xtl_logger_syslog.c 1970-01-01 01:00:00.000000000 +0100
+++ b/tools/libxc/xtl_logger_syslog.c 2010-06-05 00:52:09.000000000 +0100
@@ -0,0 +1,152 @@
+/**
+*xtl_logger_syslog.c
+*
+*xentool log comsumer implementation, that will log into syslog
+*
+*Copyright (c) 2010 Flexiant Ltd.
+**/
+#include "xentoollog.h"
+
+#include <sys/syslog.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <pthread.h>
+
+typedef struct _log_map{
+ xentoollog_level xen_log;
+ int syslog_level;
+}LOG_MAP;
+
+LOG_MAP log_mappings[] =
+ {
+ {XTL_DEBUG,LOG_DEBUG},
+ {XTL_VERBOSE,LOG_DEBUG},
+ {XTL_DETAIL,LOG_DEBUG},
+ {XTL_PROGRESS,LOG_DEBUG},
+ {XTL_INFO,LOG_INFO},
+ {XTL_NOTICE,LOG_NOTICE},
+ {XTL_WARN,LOG_WARNING},
+ {XTL_ERROR,LOG_ERR},
+ {XTL_CRITICAL,LOG_CRIT}
+ };
+
+int maptable_len = sizeof(log_mappings)/sizeof(LOG_MAP);
+
+
+struct xentoollog_logger_syslogger{
+ xentoollog_logger vtable;
+ pthread_mutex_t mutex; //syslog in not thread safe at all therefore we need a lock before issue a syslog call
+ unsigned flags;
+};
+
+/**
+Returns mapping syslog level for a given xentoollog_level
+**/
+static int get_syslog_level(xentoollog_level level){
+ int i;
+ for (i=0; i<maptable_len; i++){
+ LOG_MAP map = log_mappings[i];
+ if (map.xen_log==level){
+ return map.syslog_level;
+ }
+ }
+ // If a mapping is not found use LOG_INFO as default
+ return LOG_INFO;
+}
+
+
+static void syslogger_vmessage(xentoollog_logger *logger_in,
+ xentoollog_level level,
+ int errnoval,
+ const char *context,
+ const char *format,
+ va_list al) {
+ char *buffer;
+ xentoollog_logger_syslogger *lg = (void*)logger_in;
+
+ buffer = (char *)calloc(1024,sizeof(char));
+ if (context && (lg->flags & XTL_SHOW_PID)){
+ char *new_format = (char *) calloc(13+strlen(context)+10,sizeof(char));
+ sprintf(new_format,"[%s] [%lu] : ",context,(unsigned long)getpid());
+ strcat(buffer,new_format);
+ free(new_format);
+
+ }else if(context){
+ char *new_format = (char *) calloc(7+strlen(context),sizeof(char));
+ sprintf(new_format,"[%s] : ",context);
+ strcat(buffer,new_format);
+ free(new_format);
+
+ }else if(lg->flags & XTL_SHOW_PID){
+ char *new_format = (char *) calloc(18,sizeof(char));
+ sprintf(new_format,"[%lu] : ",(unsigned long)getpid());
+ strcat(buffer,new_format);
+ free(new_format);
+
+ }
+
+ if (errnoval >= 0){
+ char *new_format = (char *) calloc(100,sizeof(char));
+ sprintf(new_format,"[%s] : ",strerror(errnoval));
+ strcat(buffer,new_format);
+ free(new_format);
+ }
+
+ strcat(buffer,format);
+
+ pthread_mutex_lock(&lg->mutex);
+ vsyslog(get_syslog_level(level),buffer,al);
+ pthread_mutex_unlock(&lg->mutex);
+
+ free(buffer);
+}
+
+static void syslogger_progress(struct xentoollog_logger *logger_in,
+ const char *context,
+ const char *doing_what, int percent,
+ unsigned long done, unsigned long total){
+ xentoollog_logger_syslogger *lg = (void *)logger_in;
+
+ pthread_mutex_lock(&lg->mutex);
+ syslog(get_syslog_level(XTL_PROGRESS),"%s%s" "%s: %lu/%lu %3d%%",
+ context?context:"", context?": ":"",
+ doing_what, done, total, percent);
+ pthread_mutex_unlock(&lg->mutex);
+}
+
+static void syslogger_destroy(struct xentoollog_logger *logger_in) {
+ xentoollog_logger_syslogger *lg = (void*)logger_in;
+ closelog();
+ pthread_mutex_destroy(&lg->mutex);
+ free(lg);
+}
+
+static void syslogger_set_minlevel(struct xentoollog_logger *logger_in,
+ xentoollog_level minlevel){
+ setlogmask(LOG_UPTO(get_syslog_level(minlevel)));
+}
+
+static void syslogger_adjust_flags(struct xentoollog_logger *logger_in,
+ unsigned set_flags, unsigned clear_flags){
+ xentoollog_logger_syslogger *lg = (void *)logger_in;
+ unsigned new_flags = (lg->flags & ~clear_flags) | set_flags;
+ lg->flags = new_flags;
+}
+
+xentoollog_logger_syslogger *xtl_createlogger_syslogger
+ (int syslog_facility, xentoollog_level min_level, unsigned flags) {
+
+ xentoollog_logger_syslogger newlogger;
+ newlogger.flags = flags;
+ pthread_mutex_init(&newlogger.mutex,NULL);;
+
+ openlog("",LOG_CONS | LOG_NDELAY,syslog_facility);
+ setlogmask(LOG_UPTO(get_syslog_level(min_level)));
+
+ return XTL_NEW_LOGGER(syslogger, newlogger);
+}
+
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next prev parent reply other threads:[~2010-06-05 0:51 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-02 21:39 syslog support to xentoollog Gihan Munasinghe
2010-06-03 10:21 ` Stefano Stabellini
2010-06-03 14:31 ` Gihan Munasinghe
2010-06-04 11:25 ` Ian Jackson
2010-06-05 0:51 ` Gihan Munasinghe [this message]
2010-06-07 6:51 ` [PATCH] " Keir Fraser
2010-06-07 10:37 ` Ian Jackson
2010-06-07 10:33 ` Ian Jackson
2010-06-07 11:36 ` Gihan Munasinghe
2010-06-07 11:51 ` Ian Jackson
2010-06-07 10:36 ` Ian Jackson
2010-06-07 11:37 ` Gihan Munasinghe
2010-06-07 11:51 ` Ian Jackson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C099F90.3080205@flexiant.com \
--to=gmunasinghe@flexiant.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.