Merge pull request #3499 from kumpera/fix_logging
authormonojenkins <jo.shields+jenkins@xamarin.com>
Thu, 1 Sep 2016 02:40:12 +0000 (03:40 +0100)
committerGitHub <noreply@github.com>
Thu, 1 Sep 2016 02:40:12 +0000 (03:40 +0100)
[logging] Ensure glib logging redirection and remove unwanted new pub api functions.

mono/utils/mono-log-common.c
mono/utils/mono-log-posix.c
mono/utils/mono-log-windows.c
mono/utils/mono-logger-internals.h
mono/utils/mono-logger.c
mono/utils/mono-logger.h

index fa11aabcb7b2789f1a1b6f8f486a369bd8dee21c..cf73d9acbb84cbcafc5328dc5fb6b3b6f9975e50 100644 (file)
@@ -25,7 +25,7 @@
 #else
 #include <process.h>
 #endif
-#include "mono-logger.h"
+#include "mono-logger-internals.h"
 
 static FILE *logFile = NULL;
 static void *logUserData = NULL;
@@ -98,19 +98,17 @@ mono_log_open_logfile(const char *path, void *userData)
  *     @vargs - Variable argument list
  */
 void
-mono_log_write_logfile(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *format, va_list args)
+mono_log_write_logfile (const char *log_domain, GLogLevelFlags level, mono_bool hdr, const char *message)
 {
        time_t t;
-       char logTime[80],       
-            logMessage[512];
-       pid_t pid;
-       int iLog = 0;
-       size_t nLog;
 
        if (logFile == NULL)
                logFile = stdout;
 
        if (hdr) {
+               pid_t pid;
+               char logTime [80];
+
 #ifndef HOST_WIN32
                struct tm tod;
                time(&t);
@@ -124,15 +122,14 @@ mono_log_write_logfile(const char *domain, GLogLevelFlags level, mono_bool hdr,
                pid = _getpid();
                strftime(logTime, sizeof(logTime), "%F %T", tod);
 #endif
-               iLog = sprintf(logMessage, "%s level[%c] mono[%d]: ",
-                              logTime,mapLogFileLevel(level),pid);
+               fprintf (logFile, "%s level[%c] mono[%d]: %s\n", logTime, mapLogFileLevel (level), pid, message);
+       } else {
+               fprintf (logFile, "%s%s%s\n",
+                       log_domain != NULL ? log_domain : "",
+                       log_domain != NULL ? ": " : "",
+                       message);
        }
-       nLog = sizeof(logMessage) - iLog - 2;
-       vsnprintf(logMessage+iLog, nLog, format, args);
-       iLog = strlen(logMessage);
-       logMessage[iLog++] = '\n';
-       logMessage[iLog++] = '\0';
-       fputs(logMessage, logFile);
+
        fflush(logFile);
 
        if (level == G_LOG_FLAG_FATAL)
index 1ce111c1762e2ee67fea21015345fa6ea4c7ffdb..388fd26202f6c5f4b2b936b6bf81592d6ed0d049 100644 (file)
@@ -25,7 +25,7 @@
 #include <errno.h>
 #include <time.h>
 #include <sys/time.h>
-#include "mono-logger.h"
+#include "mono-logger-internals.h"
 
 static void *logUserData = NULL;
 
@@ -70,7 +70,7 @@ mono_log_open_syslog(const char *ident, void *userData)
 }
 
 /**
- * mono_log_write_logfile
+ * mono_log_write_syslog
  *     
  *     Write data to the log file.
  *
@@ -80,9 +80,9 @@ mono_log_open_syslog(const char *ident, void *userData)
  *     @vargs - Variable argument list
  */
 void
-mono_log_write_syslog(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *format, va_list args)
+mono_log_write_syslog(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *message)
 {
-       vsyslog(mapSyslogLevel(level), format, args);
+       syslog (mapSyslogLevel(level), "%s", message);
 
        if (level == G_LOG_FLAG_FATAL)
                abort();
index 1746128a9384306ebbd0619ec95335eb08264ec4..d0ee01994371e00665dcea0f29e18634b377a66d 100644 (file)
@@ -23,7 +23,7 @@
 #include <errno.h>
 #include <time.h>
 #include <process.h>
-#include "mono-logger.h"
+#include "mono-logger-internals.h"
 
 static FILE *logFile = NULL;
 static void *logUserData = NULL;
@@ -85,31 +85,23 @@ mono_log_open_syslog(const char *ident, void *userData)
  *     @vargs - Variable argument list
  */
 void
-mono_log_write_syslog(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *format, va_list args)
+mono_log_write_syslog(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *message)
 {
        time_t t;
-       struct tm *tod;
-       char logTime[80],
-             logMessage[512];
        pid_t pid;
-       int iLog = 0;
-       size_t nLog;
+       char logTime [80];
 
        if (logFile == NULL)
-               mono_log_open_syslog(NULL, NULL);
+               logFile = stdout;
 
+       struct tm *tod;
        time(&t);
        tod = localtime(&t);
        pid = _getpid();
-       strftime(logTime, sizeof(logTime), "%Y-%m-%d %H:%M:%S", tod);
-       iLog = sprintf(logMessage, "%s level[%c] mono[%d]: ",
-                      logTime,mapLogFileLevel(level),pid);
-       nLog = sizeof(logMessage) - iLog - 2;
-       vsnprintf(logMessage+iLog, nLog, format, args);
-       iLog = strlen(logMessage);
-       logMessage[iLog++] = '\n';
-       logMessage[iLog++] = 0;
-       fputs(logMessage, logFile);
+       strftime(logTime, sizeof(logTime), "%F %T", tod);
+
+       fprintf (logFile, "%s level[%c] mono[%d]: %s\n", logTime, mapLogFileLevel (level), pid, message);
+
        fflush(logFile);
 
        if (level == G_LOG_FLAG_FATAL)
index f32a25e306d75f5a64ddd70ef84aaea354a290e2..57ef259677fd4b3ec81df0cadc1f70e6da914eb0 100644 (file)
@@ -149,6 +149,31 @@ mono_trace_message(MonoTraceMask mask, const char *format, ...)
 
 #endif
 
+/* Internal logging API */
+typedef void (*MonoLoggerOpen) (const char *, void *);
+typedef void (*MonoLoggerWrite) (const char *, GLogLevelFlags, mono_bool, const char *);
+typedef void (*MonoLoggerClose) (void);
+
+typedef struct _MonoLogCallParm_ {
+       MonoLoggerOpen  opener;         /* Routine to open logging */
+       MonoLoggerWrite writer;         /* Routine to write log data */
+       MonoLoggerClose closer;         /* Routine to close logging */
+       char            *dest;          /* Log destination */
+       void            *user_data;     /* User data from legacy handler */
+       mono_bool       header;         /* Whether we want pid/time/date in log message */
+} MonoLogCallParm;
+
+void mono_trace_set_log_handler_internal (MonoLogCallParm *callback, void *user_data);
+void mono_trace_set_logdest_string (const char *value);
+void mono_trace_set_logheader_string (const char *value);
+
+void mono_log_open_syslog (const char *, void *);
+void mono_log_write_syslog (const char *, GLogLevelFlags, mono_bool, const char *);
+void mono_log_close_syslog (void);
+
+void mono_log_open_logfile (const char *, void *);
+void mono_log_write_logfile (const char *, GLogLevelFlags, mono_bool, const char *);
+void mono_log_close_logfile (void);
 
 G_END_DECLS
 
index f6cdd40b20d8df63eb141fdebd1b721017e12899..20457c95b677c91eedb261eace27b409229db62d 100644 (file)
@@ -29,7 +29,7 @@ static MonoLogCallParm logCallback = {
 typedef struct {
    MonoLogCallback legacy_callback;
    gpointer user_data;
-} legacyLoggerUserData;
+} UserSuppliedLoggerUserData;
 
 /**
  * mono_trace_init:
@@ -81,19 +81,19 @@ mono_trace_cleanup (void)
 void 
 mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
 {
+       char *log_message;
        if (level_stack == NULL) {
                mono_trace_init ();
                if(level > mono_internal_current_level || !(mask & mono_internal_current_mask))
                        return;
        }
 
-       if (logCallback.opener == NULL) {
-               logCallback.opener = mono_log_open_logfile;
-               logCallback.writer = mono_log_write_logfile;
-               logCallback.closer = mono_log_close_logfile;
-               logCallback.opener(NULL, NULL);
-       }
-       logCallback.writer(mono_log_domain, level, logCallback.header, format, args);
+       g_assert (logCallback.opener); // mono_trace_init should have provided us with one!
+
+       if (g_vasprintf (&log_message, format, args) < 0)
+               return;
+       logCallback.writer (mono_log_domain, level, logCallback.header, log_message);
+       g_free (log_message);
 }
 
 /**
@@ -340,13 +340,19 @@ log_level_get_name (GLogLevelFlags log_level)
  * logging. We ignore the header request as legacy handlers never had headers.
  */
 static void
-callback_adapter(const char *domain, GLogLevelFlags level, mono_bool fatal, const char *fmt, va_list args)
+callback_adapter (const char *domain, GLogLevelFlags level, mono_bool fatal, const char *message)
 {
-       legacyLoggerUserData *ll = (legacyLoggerUserData *) logCallback.user_data;
-       const char *msg = g_strdup_vprintf (fmt, args);
+       UserSuppliedLoggerUserData *ll =logCallback.user_data;
 
-       ll->legacy_callback (domain, log_level_get_name(level), msg, fatal, ll->user_data);
-       g_free ((void *) msg);
+       ll->legacy_callback (domain, log_level_get_name(level), message, fatal, ll->user_data);
+}
+
+static void
+eglib_log_adapter (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
+{
+       UserSuppliedLoggerUserData *ll = logCallback.user_data;
+
+       ll->legacy_callback (log_domain, log_level_get_name (log_level), message, log_level & G_LOG_LEVEL_ERROR, ll->user_data);
 }
 
 /**
@@ -369,7 +375,7 @@ static void
 legacy_closer(void)
 {
        if (logCallback.user_data != NULL) {
-               g_free (logCallback.user_data); /* This is a LegacyLoggerUserData struct */
+               g_free (logCallback.user_data); /* This is a UserSuppliedLoggerUserData struct */
                logCallback.opener = NULL;      
                logCallback.writer = NULL;
                logCallback.closer = NULL;
@@ -386,15 +392,16 @@ legacy_closer(void)
  * 
  * The log handler replaces the default runtime logger. All logging requests with be routed to it.
  * If the fatal argument in the callback is true, the callback must abort the current process. The runtime expects that
- * execution will not resume after a fatal error. This is for "old-style" or legacy log handers.
+ * execution will not resume after a fatal error.
  */
 void
 mono_trace_set_log_handler (MonoLogCallback callback, void *user_data)
 {
-        g_assert (callback);
+       g_assert (callback);
+
        if (logCallback.closer != NULL)
                logCallback.closer();
-       legacyLoggerUserData *ll = g_malloc (sizeof (legacyLoggerUserData));
+       UserSuppliedLoggerUserData *ll = g_malloc (sizeof (UserSuppliedLoggerUserData));
        ll->legacy_callback = callback;
        ll->user_data = user_data;
        logCallback.opener = legacy_opener;
@@ -402,6 +409,14 @@ mono_trace_set_log_handler (MonoLogCallback callback, void *user_data)
        logCallback.closer = legacy_closer;
        logCallback.user_data = ll;
        logCallback.dest = NULL;
+
+       g_log_set_default_handler (eglib_log_adapter, user_data);
+}
+
+static void
+structured_log_adapter (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
+{
+       logCallback.writer (log_domain, log_level, logCallback.header, message);
 }
 
 /**
@@ -425,7 +440,9 @@ mono_trace_set_log_handler_internal (MonoLogCallParm *callback, void *user_data)
        logCallback.closer = callback->closer;
        logCallback.header = mono_trace_log_header;
        logCallback.dest   = callback->dest;
-       logCallback.opener(logCallback.dest, user_data);
+       logCallback.opener (logCallback.dest, user_data);
+
+       g_log_set_default_handler (structured_log_adapter, user_data);
 }
 
 static void
index 073daf1c87a16260f452584f96026e771eff8167..5f0943d5e1d698981354c2c86604edda6255d204 100644 (file)
@@ -10,32 +10,9 @@ mono_trace_set_level_string (const char *value);
 MONO_API void 
 mono_trace_set_mask_string (const char *value);
 
-MONO_API void 
-mono_trace_set_logdest_string (const char *value);
-
-MONO_API void 
-mono_trace_set_logheader_string (const char *value);
-
 typedef void (*MonoPrintCallback) (const char *string, mono_bool is_stdout);
 typedef void (*MonoLogCallback) (const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data);
 
-
-typedef void (*MonoLoggerOpen) (const char *, void *);
-typedef void (*MonoLoggerWrite) (const char *, GLogLevelFlags, mono_bool, const char *, va_list);
-typedef void (*MonoLoggerClose) (void);
-
-typedef struct _MonoLogCallParm_ {
-       MonoLoggerOpen  opener;         /* Routine to open logging */
-       MonoLoggerWrite writer;         /* Routine to write log data */
-       MonoLoggerClose closer;         /* Routine to close logging */
-       char            *dest;          /* Log destination */
-       void            *user_data;     /* User data from legacy handler */
-       mono_bool       header;         /* Whether we want pid/time/date in log message */
-} MonoLogCallParm;
-
-void
-mono_trace_set_log_handler_internal (MonoLogCallParm *callback, void *user_data);
-
 MONO_API void
 mono_trace_set_log_handler (MonoLogCallback callback, void *user_data);
 
@@ -45,24 +22,6 @@ mono_trace_set_print_handler (MonoPrintCallback callback);
 MONO_API void
 mono_trace_set_printerr_handler (MonoPrintCallback callback);
 
-MONO_API void
-mono_log_open_syslog(const char *, void *);
-
-MONO_API void
-mono_log_write_syslog(const char *, GLogLevelFlags, mono_bool, const char *, va_list);
-
-MONO_API void
-mono_log_close_syslog(void);
-
-MONO_API void
-mono_log_open_logfile(const char *, void *);
-
-MONO_API void
-mono_log_write_logfile(const char *, GLogLevelFlags, mono_bool, const char *, va_list);
-
-MONO_API void
-mono_log_close_logfile(void);
-
 MONO_END_DECLS
 
 #endif /* __MONO_LOGGER_H__ */