d0ee01994371e00665dcea0f29e18634b377a66d
[mono.git] / mono / utils / mono-log-windows.c
1 /*
2  * mono-log-windows.c: Simplistic simulation of a syslog logger for Windows
3  *
4  * This module contains the Windows syslog logger interface
5  *
6  * Author:
7  *    Neale Ferguson <neale@sinenomine.net>
8  *
9  */
10 #include <config.h>
11
12 #ifdef HAVE_UNISTD_H
13 #include <unistd.h>
14 #endif
15
16 #ifdef HOST_WIN32
17
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <ctype.h>
21 #include <string.h>
22 #include <glib.h>
23 #include <errno.h>
24 #include <time.h>
25 #include <process.h>
26 #include "mono-logger-internals.h"
27
28 static FILE *logFile = NULL;
29 static void *logUserData = NULL;
30 static wchar_t *logFileName = L".//mono.log";
31
32 /**
33  * mapSyslogLevel:
34  *      
35  *      @level - GLogLevelFlags value
36  *      @returns The equivalent character identifier
37  */
38 static inline char 
39 mapLogFileLevel(GLogLevelFlags level) 
40 {
41         if (level & G_LOG_LEVEL_ERROR)
42                 return ('E');
43         if (level & G_LOG_LEVEL_CRITICAL)
44                 return ('C');
45         if (level & G_LOG_LEVEL_WARNING)
46                 return ('W');
47         if (level & G_LOG_LEVEL_MESSAGE)
48                 return ('N');
49         if (level & G_LOG_LEVEL_INFO)
50                 return ('I');
51         if (level & G_LOG_LEVEL_DEBUG)
52                 return ('D');
53         return ('I');
54 }
55
56 /**
57  * mono_log_open_syslog
58  *      
59  *      Open the syslog file. If the open fails issue a warning and 
60  *      use stdout as the log file destination.
61  *
62  *      @ident - Identifier: ignored
63  *      @userData - Not used
64  */
65 void
66 mono_log_open_syslog(const char *ident, void *userData)
67 {
68         logFile = _wfopen(logFileName, L"w");
69         if (logFile == NULL) {
70                 g_warning("opening of log file %s failed with %s",
71                           strerror(errno));
72                 logFile = stdout;
73         }
74         logUserData = userData;
75 }
76
77 /**
78  * mono_log_write_syslog
79  *      
80  *      Write data to the syslog file.
81  *
82  *      @domain - Identifier string
83  *      @level - Logging level flags
84  *      @format - Printf format string
85  *      @vargs - Variable argument list
86  */
87 void
88 mono_log_write_syslog(const char *domain, GLogLevelFlags level, mono_bool hdr, const char *message)
89 {
90         time_t t;
91         pid_t pid;
92         char logTime [80];
93
94         if (logFile == NULL)
95                 logFile = stdout;
96
97         struct tm *tod;
98         time(&t);
99         tod = localtime(&t);
100         pid = _getpid();
101         strftime(logTime, sizeof(logTime), "%F %T", tod);
102
103         fprintf (logFile, "%s level[%c] mono[%d]: %s\n", logTime, mapLogFileLevel (level), pid, message);
104
105         fflush(logFile);
106
107         if (level == G_LOG_FLAG_FATAL)
108                 abort();
109 }
110
111 /**
112  * mono_log_close_syslog
113  *
114  *      Close the syslog file
115  */
116 void
117 mono_log_close_syslog()
118 {
119         if (logFile) {
120                 fclose(logFile);
121                 logFile = NULL;
122         }
123 }
124 #endif