Fix whitespace
[mono.git] / mono / utils / mono-logger.c
index 7d0c9ce12a4f811d33e6d5a3bca405b2f564da03..fb73af27aeff6c59abfdbb97d8cc278be1fca55b 100644 (file)
@@ -18,6 +18,12 @@ static GQueue                *level_stack            = NULL;
 static const char      *mono_log_domain        = "Mono";
 static MonoPrintCallback print_callback, printerr_callback;
 
+static MonoLogCallback logCallback = {
+       .opener = NULL,
+       .writer = NULL,
+       .closer = NULL
+};
+
 /**
  * mono_trace_init:
  *
@@ -32,6 +38,7 @@ mono_trace_init (void)
 
                mono_trace_set_mask_string(g_getenv("MONO_LOG_MASK"));
                mono_trace_set_level_string(g_getenv("MONO_LOG_LEVEL"));
+               mono_trace_set_logdest_string(g_getenv("MONO_LOG_DEST"));
        }
 }
 
@@ -71,7 +78,13 @@ mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format,
                        return;
        }
 
-       g_logv (mono_log_domain, level, format, args);
+       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, format, args);
 }
 
 /**
@@ -110,6 +123,35 @@ mono_trace_set_mask (MonoTraceMask mask)
        mono_internal_current_mask      = mask;
 }
 
+/**
+ * mono_trace_set_logdest:
+ *
+ *     @dest: Destination for logging
+ *
+ * Sets the current logging destination. This can be a file or, if supported,
+ * syslog.
+ */
+void 
+mono_trace_set_logdest_string (const char *dest)
+{
+       MonoLogCallback logger;
+
+       if(level_stack == NULL)
+               mono_trace_init();
+
+       if ((dest == NULL) || (strcmp("syslog", dest) != 0)) {
+               logger.opener = mono_log_open_logfile;
+               logger.writer = mono_log_write_logfile;
+               logger.closer = mono_log_close_logfile;
+               mono_trace_set_log_handler(&logger, dest, NULL);
+       } else {
+               logger.opener = mono_log_open_syslog;
+               logger.writer = mono_log_write_syslog;
+               logger.closer = mono_log_close_syslog;
+               mono_trace_set_log_handler(&logger, mono_log_domain, NULL);
+       }
+}
+
 /**
  * mono_trace_push:
  *
@@ -236,28 +278,6 @@ mono_trace_is_traced (GLogLevelFlags level, MonoTraceMask mask)
        return (level <= mono_internal_current_level && mask & mono_internal_current_mask);
 }
 
-static MonoLogCallback log_callback;
-
-static const char*
-log_level_get_name (GLogLevelFlags log_level)
-{
-       switch (log_level & G_LOG_LEVEL_MASK) {
-       case G_LOG_LEVEL_ERROR: return "error";
-       case G_LOG_LEVEL_CRITICAL: return "critical";
-       case G_LOG_LEVEL_WARNING: return "warning";
-       case G_LOG_LEVEL_MESSAGE: return "message";
-       case G_LOG_LEVEL_INFO: return "info";
-       case G_LOG_LEVEL_DEBUG: return "debug";
-       default: return "unknown";
-       }
-}
-
-static void
-log_adapter (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
-{
-       log_callback (log_domain, log_level_get_name (log_level), message, log_level & G_LOG_LEVEL_ERROR, user_data);
-}
-
 /**
  * mono_trace_set_log_handler:
  *
@@ -269,11 +289,13 @@ log_adapter (const gchar *log_domain, GLogLevelFlags log_level, const gchar *mes
  * execution will not resume after a fatal error.
  */
 void
-mono_trace_set_log_handler (MonoLogCallback callback, void *user_data)
+mono_trace_set_log_handler (MonoLogCallback *callback, const char *dest, void *user_data)
 {
        g_assert (callback);
-       log_callback = callback;
-       g_log_set_default_handler (log_adapter, user_data);
+       logCallback.opener = callback->opener;
+       logCallback.writer = callback->writer;
+       logCallback.closer = callback->closer;
+       logCallback.opener(dest, user_data);
 }
 
 static void