[virt-tools-list] [PATCH virt-viewer] win32: use Windows Event Log for glib logging

Christophe Fergeau cfergeau at redhat.com
Fri Jan 25 13:55:06 UTC 2013


Hey,

On Wed, Jan 23, 2013 at 12:05:29AM +0100, Marc-André Lureau wrote:
> Windows has a proper service for logging events and messages in a
> structured way. It does many nice things, and "Event Viewer" allows
> UI browsing / filtering of messages etc..
> 
> Note we don't really use any category or event ID but solely log level
> and string. To make the Event Viewer happy, we still register a string
> for our event. And MinGW doesn't seem to like linking to multiple
> resource objects (apparently takes the first one and ignores the
> rest?)
> 
> The installer should add a registry key for the event source, however
> it's not possible as a user, and the NSIS script is kinda user only
> atm... The MSI will support those entries:
> http://msdn.microsoft.com/en-us/library/windows/desktop/aa363661%28v=vs.85%29.aspx
> 
> HKLM\SYSTEM\CurrentControlSet\services\eventlog\Application\VirtViewer
> EventMessage $prefix\bin\remote-viewer.exe
> 
> It's a minor annoyance if those entries are not in the registry
> (basically, Event Viewer will complain a little, and it will be
> impossible? to do create application filters)
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=895919
> ---
>  configure.ac           |  6 ++++++
>  src/Makefile.am        | 23 +++++++++++++++++------
>  src/virt-viewer-util.c | 38 ++++++++++++++++++++++++++++++++++++++
>  src/win32-messages.mc  | 36 ++++++++++++++++++++++++++++++++++++
>  4 files changed, 97 insertions(+), 6 deletions(-)
>  create mode 100644 src/win32-messages.mc
> 
> diff --git a/configure.ac b/configure.ac
> index 339acbe..8419e85 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -46,6 +46,12 @@ AS_IF([test "x$os_win32" = "xyes"], [
>       if test -z "$WINDRES" ; then
>         AC_MSG_ERROR("windres is required to compile virt-viewer on this platform")
>       fi
> +
> +     AC_CHECK_TOOL(WINDMC, [windmc])
> +
> +     if test -z "$WINDMC" ; then
> +       AC_MSG_ERROR("windmc is required to compile virt-viewer on this platform")
> +     fi
>  ])
>  
>  AC_CONFIG_LIBOBJ_DIR([src])
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 05e20b2..d5e98b1 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -1,5 +1,6 @@
>  NULL =
>  LDADD =
> +CLEANFILES =
>  MAINTAINERCLEANFILES =

Setting MAINTAINERCLEANFILES is no longer needed here

>  bin_PROGRAMS =
>  
> @@ -141,23 +142,33 @@ desktop_DATA = remote-viewer.desktop
>  
>  EXTRA_DIST += $(desktop_DATA)
>  
> -VIRT_VIEWER_RES = virt-viewer.rc virt-viewer.manifest
> -ICONDIR = $(top_builddir)/icons
> -MANIFESTDIR = $(srcdir)
> -EXTRA_DIST += $(VIRT_VIEWER_RES)
>  
>  if OS_WIN32
>  bin_PROGRAMS += windows-cmdline-wrapper
>  windows_cmdline_wrapper_SOURCES = windows-cmdline-wrapper.c
>  windows_cmdline_wrapper_LDFLAGS = -lpsapi
>  
> -virt-viewer_rc.$(OBJEXT): $(VIRT_VIEWER_RES) $(ICONDIR)/virt-viewer.ico
> +VIRT_VIEWER_RES = virt-viewer.rc virt-viewer.manifest
> +EXTRA_DIST += $(VIRT_VIEWER_RES) win32-messages.mc
> +
> +ICONDIR = $(top_builddir)/icons
> +MANIFESTDIR = $(srcdir)
> +
> +win32-messages.rc: win32-messages.mc
> +	$(AM_V_GEN)$(WINDMC) $<

As I understand it, this will generate win32-message.h which is then used
in virt-viewer-util.c, do we need to encode this dependency somehow?

> +
> +win32-messages_rc.$(OBJEXT): win32-messages.rc
> +	$(AM_V_GEN)$(WINDRES) -i $< -o $@

It seems this object is not used, is this rule needed?

> +
> +virt-viewer_rc.$(OBJEXT): $(VIRT_VIEWER_RES) win32-messages.rc $(ICONDIR)/virt-viewer.ico
>  	$(AM_V_GEN)$(WINDRES)				\
>  		-DICONDIR='\"$(ICONDIR)\"'		\
>  		-DMANIFESTDIR='\"$(MANIFESTDIR)\"'	\
>  		-i $< -o $@
> +
>  LDADD += virt-viewer_rc.$(OBJEXT)
> -MAINTAINERCLEANFILES += virt-viewer_rc.$(OBJEXT)
> +CLEANFILES += virt-viewer_rc.$(OBJEXT)
> +CLEANFILES += win32-messages.rc Messages_*.bin
>  
>  bin_PROGRAMS += debug-helper
>  debug_helper_SOURCES = debug-helper.c
> diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c
> index 48a6978..7ee5e63 100644
> --- a/src/virt-viewer-util.c
> +++ b/src/virt-viewer-util.c
> @@ -30,6 +30,7 @@
>  #ifdef G_OS_WIN32
>  #include <windows.h>
>  #include <io.h>
> +#include "win32-messages.h"

Where is this file coming from? Is this autogenerated or did you forget a
git add ?

>  #endif
>  
>  #include <sys/types.h>
> @@ -261,9 +262,46 @@ gulong virt_viewer_signal_connect_object(gpointer instance,
>      return ctx->handler_id;
>  }
>  
> +#ifdef G_OS_WIN32
> +static HANDLE ms_eventlog = NULL;
> +
> +static void virt_viewer_log_handler (const gchar *log_domain,
> +                                     GLogLevelFlags log_level,
> +                                     const gchar *message,
> +                                     G_GNUC_UNUSED gpointer user_data)
> +{
> +    WORD logtype;
> +
> +    switch (log_level) {
> +    case G_LOG_LEVEL_ERROR:
> +    case G_LOG_LEVEL_CRITICAL:
> +        logtype = EVENTLOG_ERROR_TYPE;
> +        break;
> +    case G_LOG_LEVEL_WARNING:
> +        logtype = EVENTLOG_WARNING_TYPE;
> +        break;
> +    default:
> +        logtype = EVENTLOG_INFORMATION_TYPE;
> +    }
> +
> +    gchar *msg = g_strdup_printf("%s: %s", log_domain, message);
> +    ReportEventA(ms_eventlog, logtype, 0, EVENT_GLOG, NULL, 1, 0,
> +                 (const char **)&msg, NULL);
> +    g_free(msg);
> +}
> +#endif
> +
>  void virt_viewer_util_init(const char *appname)
>  {
>  #ifdef G_OS_WIN32
> +    ms_eventlog = RegisterEventSourceA(NULL, "VirtViewer");

Using PACKAGE_NAME here would give us different log domains for virt-viewer
and remote-viewer, dunno if that's something we want or not.

> +    if (ms_eventlog == NULL)
> +        g_printerr("can't open Windows event log\n");
> +    else
> +        g_log_set_default_handler(virt_viewer_log_handler, NULL);

Can you pass ms_eventlog as user_data instead of having it as a global
variable?

> +
> +    g_message(PACKAGE_STRING " started on Windows");
> +
>      /*
>       * This named mutex will be kept around by Windows until the
>       * process terminates. This allows other instances to check if it
> diff --git a/src/win32-messages.mc b/src/win32-messages.mc
> new file mode 100644
> index 0000000..2c283ca
> --- /dev/null
> +++ b/src/win32-messages.mc
> @@ -0,0 +1,36 @@
> +;#ifndef __MESSAGES_H__
> +;#define __MESSAGES_H__
> +;
> +
> +LanguageNames =
> +    (
> +        English = 0x0409:Messages_ENU
> +    )
> +
> +
> +;////////////////////////////////////////
> +;// Eventlog categories
> +;//
> +;// Categories always have to be the first entries in a message file!
> +;//

Hmm this is contradicted by the LanguageNames entry just above this...

> +
> +MessageId       = 1
> +SymbolicName    = CATEGORY_DUMMY
> +Severity        = Success
> +Language        = English
> +A dummy category, as a reminder

Is this needed at all?


Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20130125/5c837687/attachment.sig>


More information about the virt-tools-list mailing list