Mercurial > trustbridge
changeset 615:2a4f7364ab81
Add first simple event logging functions
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Thu, 19 Jun 2014 11:53:07 +0200 |
parents | de1e3a47ed21 |
children | 0172740f5c6e |
files | common/logging.c common/logging.h |
diffstat | 2 files changed, 134 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/common/logging.c Wed Jun 18 16:35:03 2014 +0200 +++ b/common/logging.c Thu Jun 19 11:53:07 2014 +0200 @@ -9,8 +9,80 @@ #include "strhelp.h" #include <stdio.h> +#include <stdarg.h> +#include <stdbool.h> + +#include <strhelp.h> #ifdef WIN32 +# include <windows.h> +#else +# include <syslog.h> +#endif + + +#ifdef WIN32 +static void +win_log(const char *format, va_list ap, bool error) +{ + HANDLE log_src = NULL; + wchar_t *wmsg = NULL; + BOOL failure = TRUE; + WORD type = 0, + category = 0; + char buffer[MAX_LOG+1]; + + vsnprintf (buffer, MAX_LOG, format, ap); + buffer[MAX_LOG] = '\0'; + + log_src = RegisterEventSourceA (NULL, LOG_NAME); + + if (log_src == NULL) + { + PRINTLASTERROR ("Failed to open log source."); + return; + } + + if (error) + { + type = EVENTLOG_ERROR_TYPE; + } + else + { + type = EVENTLOG_INFORMATION_TYPE; + } + + wmsg = utf8_to_wchar (buffer, strlen(buffer)); + if (wmsg == NULL) + { + ERRORPRINTF ("Failed to convert log message to utf-16"); + goto done; + } + + failure = ReportEventW (log_src, + type, + category, + 0, + NULL, + 1, + 0, + (const WCHAR **) &wmsg, + NULL); + if (failure) + { + PRINTLASTERROR ("Failed to report event."); + } + +done: + xfree (wmsg); + + if (!DeregisterEventSource (log_src)) + { + PRINTLASTERROR ("Failed to close log source."); + } + return; +} + char * getLastErrorMsg() { @@ -44,4 +116,40 @@ return retval; } +#else /* WIN32 */ + + +static void +linux_log (const char *format, va_list ap, bool error) +{ + openlog (LOG_NAME, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER); + vsyslog ( error ? LOG_ERR : LOG_INFO, format, ap); +} + +#endif /* WIN32 */ + +void +syslog_info_printf(const char *format, ...) +{ + va_list args; + va_start (args, format); +#ifdef WIN32 + win_log (format, args, false); +#else + linux_log (format, args, false); #endif + va_end (args); +} + +void +syslog_error_printf(const char *format, ...) +{ + va_list args; + va_start (args, format); +#ifdef WIN32 + win_log (format, args, true); +#else + linux_log (format, args, true); +#endif + va_end (args); +}
--- a/common/logging.h Wed Jun 18 16:35:03 2014 +0200 +++ b/common/logging.h Thu Jun 19 11:53:07 2014 +0200 @@ -19,6 +19,12 @@ #include <stdio.h> +/** @def Maximum length of log messages */ +#define MAX_LOG 511 + +/** @def The name used for logging */ +#define LOG_NAME "TrustBridge" + #ifdef WIN32 #include <windows.h> @@ -108,6 +114,26 @@ ERRORPRINTF ("Failed to get error information\n"); +/** + * @brief log an informational message into the syslog / event log + * + * The message length is limited to MAX_LOG characters. Log messages + * are expected to be in UTF-8 encoding. + * + * Function paramters are the same as for the printf familiy. + */ +void syslog_info_printf(const char *format, ...); + +/** + * @brief log an error message into the syslog / event log + * + * The message length is limited to MAX_LOG characters. Log messages + * are expected to be in UTF-8 encoding. + * + * Function paramters are the same as for the printf familiy. + */ +void syslog_error_printf(const char *format, ...); + #ifdef __cplusplus } #endif