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:
*
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"));
}
}
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);
}
/**
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:
*
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:
*
* 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