[logging] Ensure glib logging redirection and remove unwanted new pub api functions.
#else
#include <process.h>
#endif
-#include "mono-logger.h"
+#include "mono-logger-internals.h"
static FILE *logFile = NULL;
static void *logUserData = NULL;
* @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);
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)
#include <errno.h>
#include <time.h>
#include <sys/time.h>
-#include "mono-logger.h"
+#include "mono-logger-internals.h"
static void *logUserData = NULL;
}
/**
- * mono_log_write_logfile
+ * mono_log_write_syslog
*
* Write data to the log file.
*
* @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();
#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;
* @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)
#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
typedef struct {
MonoLogCallback legacy_callback;
gpointer user_data;
-} legacyLoggerUserData;
+} UserSuppliedLoggerUserData;
/**
* mono_trace_init:
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);
}
/**
* 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);
}
/**
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;
*
* 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;
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);
}
/**
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
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);
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__ */