Fix whitespace
[mono.git] / mono / utils / mono-logger.c
index a6be2717e5832dd07bf50c881218d5c1b20def75..fb73af27aeff6c59abfdbb97d8cc278be1fca55b 100644 (file)
@@ -4,33 +4,41 @@
 #include <glib.h>
 
 #include "mono-compiler.h"
-#include "mono-logger-internal.h"
+#include "mono-logger-internals.h"
 
 typedef struct {
        GLogLevelFlags  level;
        MonoTraceMask   mask;
 } MonoLogLevelEntry;
 
-static GLogLevelFlags current_level            = G_LOG_LEVEL_ERROR;
-static MonoTraceMask current_mask              = MONO_TRACE_ALL;
+GLogLevelFlags mono_internal_current_level             = INT_MAX;
+MonoTraceMask  mono_internal_current_mask              = MONO_TRACE_ALL;
 
-static const char      *mono_log_domain        = "Mono";
 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:
  *
  * Initializes the mono tracer.
  */
-static void 
+void 
 mono_trace_init (void)
 {
        if(level_stack == NULL) {
+               mono_internal_current_level = G_LOG_LEVEL_ERROR;
                level_stack = g_queue_new();
 
                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"));
        }
 }
 
@@ -52,29 +60,6 @@ mono_trace_cleanup (void)
        }
 }
 
-/**
- * mono_trace:
- *
- *     @level: Verbose level of the specified message
- *     @mask: Type of the specified message
- *
- * Traces a new message, depending on the current logging level
- * and trace mask.
- */
-void
-mono_trace(GLogLevelFlags level, MonoTraceMask mask, const char *format, ...) 
-{
-       if(level_stack == NULL)
-               mono_trace_init();
-
-       if(level <= current_level && mask & current_mask) {
-               va_list args;
-               va_start (args, format);
-               g_logv (mono_log_domain, level, format, args);
-               va_end (args);
-       }
-}
-
 /**
  * mono_tracev:
  *
@@ -85,13 +70,21 @@ mono_trace(GLogLevelFlags level, MonoTraceMask mask, const char *format, ...)
  * and trace mask.
  */
 void 
-mono_tracev (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
+mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
 {
-       if (level_stack == NULL)
+       if (level_stack == NULL) {
                mono_trace_init ();
+               if(level > mono_internal_current_level || !(mask & mono_internal_current_mask))
+                       return;
+       }
 
-       if(level <= current_level && mask & current_mask)
-               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);
 }
 
 /**
@@ -109,7 +102,7 @@ mono_trace_set_level (GLogLevelFlags level)
        if(level_stack == NULL)
                mono_trace_init();
 
-       current_level = level;
+       mono_internal_current_level = level;
 }
 
 /**
@@ -127,7 +120,36 @@ mono_trace_set_mask (MonoTraceMask mask)
        if(level_stack == NULL)
                mono_trace_init();
 
-       current_mask    = 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);
+       }
 }
 
 /**
@@ -145,16 +167,16 @@ mono_trace_push (GLogLevelFlags level, MonoTraceMask mask)
        if(level_stack == NULL)
                g_error("%s: cannot use mono_trace_push without calling mono_trace_init first.", __func__);
        else {
-               MonoLogLevelEntry *entry = g_malloc(sizeof(MonoLogLevelEntry));
-               entry->level    = current_level;
-               entry->mask             = current_mask;
+               MonoLogLevelEntry *entry = (MonoLogLevelEntry *) g_malloc(sizeof(MonoLogLevelEntry));
+               entry->level    = mono_internal_current_level;
+               entry->mask             = mono_internal_current_mask;
 
                g_queue_push_head (level_stack, (gpointer)entry);
 
                /* Set the new level and mask
                 */
-               current_level = level;
-               current_mask  = mask;
+               mono_internal_current_level = level;
+               mono_internal_current_mask  = mask;
        }
 }
 
@@ -174,8 +196,8 @@ mono_trace_pop (void)
 
                        /*      Restore previous level and mask
                         */
-                       current_level = entry->level;
-                       current_mask  = entry->mask;
+                       mono_internal_current_level = entry->level;
+                       mono_internal_current_mask  = entry->mask;
 
                        g_free (entry);
                }
@@ -213,10 +235,10 @@ mono_trace_set_mask_string (const char *value)
        const char *tok;
        guint32 flags = 0;
 
-       const char *valid_flags[] = {"asm", "type", "dll", "gc", "cfg", "aot", "security", "all", NULL};
+       const char *valid_flags[] = {"asm", "type", "dll", "gc", "cfg", "aot", "security", "threadpool", "io-threadpool", "io-layer", "all", NULL};
        const MonoTraceMask     valid_masks[] = {MONO_TRACE_ASSEMBLY, MONO_TRACE_TYPE, MONO_TRACE_DLLIMPORT,
-                                                MONO_TRACE_GC, MONO_TRACE_CONFIG, MONO_TRACE_AOT, MONO_TRACE_SECURITY, 
-                                                MONO_TRACE_ALL };
+                                                MONO_TRACE_GC, MONO_TRACE_CONFIG, MONO_TRACE_AOT, MONO_TRACE_SECURITY,
+                                                MONO_TRACE_THREADPOOL, MONO_TRACE_IO_THREADPOOL, MONO_TRACE_IO_LAYER, MONO_TRACE_ALL };
 
        if(!value)
                return;
@@ -242,7 +264,7 @@ mono_trace_set_mask_string (const char *value)
                }
        }
 
-       mono_trace_set_mask (flags);
+       mono_trace_set_mask ((MonoTraceMask) flags);
 }
 
 /*
@@ -253,29 +275,7 @@ mono_trace_set_mask_string (const char *value)
 gboolean
 mono_trace_is_traced (GLogLevelFlags level, MonoTraceMask mask)
 {
-       return (level <= current_level && mask & 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);
+       return (level <= mono_internal_current_level && mask & mono_internal_current_mask);
 }
 
 /**
@@ -289,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
@@ -337,5 +339,5 @@ mono_trace_set_printerr_handler (MonoPrintCallback callback)
 {
        g_assert (callback);
        printerr_callback = callback;
-       g_set_print_handler (printerr_handler);
+       g_set_printerr_handler (printerr_handler);
 }