e28b3f361035b0c13167140acc67cad724d3da60
[mono.git] / mono / utils / mono-logger-internals.h
1 /**
2  * \file
3  */
4
5 #ifndef __MONO_LOGGER_INTERNAL_H__
6 #define __MONO_LOGGER_INTERNAL_H__
7
8 #include <glib.h>
9 #include <mono/utils/mono-compiler.h>
10 #include "mono-logger.h"
11
12 G_BEGIN_DECLS
13
14 typedef enum {
15         MONO_TRACE_ASSEMBLY             = (1<<0),
16         MONO_TRACE_TYPE                 = (1<<1),
17         MONO_TRACE_DLLIMPORT            = (1<<2),
18         MONO_TRACE_GC                   = (1<<3),
19         MONO_TRACE_CONFIG               = (1<<4),
20         MONO_TRACE_AOT                  = (1<<5),
21         MONO_TRACE_SECURITY             = (1<<6),
22         MONO_TRACE_THREADPOOL           = (1<<7),
23         MONO_TRACE_IO_THREADPOOL        = (1<<8),
24         MONO_TRACE_IO_LAYER             = (1<<9),
25         MONO_TRACE_W32HANDLE    = (1<<10),
26         MONO_TRACE_ALL                  = MONO_TRACE_ASSEMBLY |
27                                           MONO_TRACE_TYPE |
28                                           MONO_TRACE_DLLIMPORT |
29                                           MONO_TRACE_GC |
30                                           MONO_TRACE_CONFIG |
31                                           MONO_TRACE_AOT |
32                                           MONO_TRACE_SECURITY |
33                                           MONO_TRACE_THREADPOOL |
34                                           MONO_TRACE_IO_THREADPOOL |
35                                           MONO_TRACE_IO_LAYER |
36                                           MONO_TRACE_W32HANDLE
37 } MonoTraceMask;
38
39 MONO_API extern GLogLevelFlags mono_internal_current_level;
40 MONO_API extern MonoTraceMask mono_internal_current_mask;
41
42 void 
43 mono_trace_init (void);
44
45 void 
46 mono_trace_cleanup (void);
47
48 MONO_API void
49 mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args);
50
51 void 
52 mono_trace_set_level (GLogLevelFlags level);
53
54 void 
55 mono_trace_set_mask (MonoTraceMask mask);
56
57 void 
58 mono_trace_push (GLogLevelFlags level, MonoTraceMask mask);
59
60 void 
61 mono_trace_pop (void);
62
63 gboolean
64 mono_trace_is_traced (GLogLevelFlags level, MonoTraceMask mask);
65
66 G_GNUC_UNUSED static void
67 mono_tracev (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
68 {
69         if(G_UNLIKELY (level <= mono_internal_current_level && mask & mono_internal_current_mask))
70                 mono_tracev_inner (level, mask, format, args);
71 }
72
73 /**
74  * mono_trace:
75  *
76  *      @level: Verbose level of the specified message
77  *      @mask: Type of the specified message
78  *
79  * Traces a new message, depending on the current logging level
80  * and trace mask.
81  */
82 G_GNUC_UNUSED MONO_ATTR_FORMAT_PRINTF(3,4) static void
83 mono_trace (GLogLevelFlags level, MonoTraceMask mask, const char *format, ...)
84 {
85         if(G_UNLIKELY (level <= mono_internal_current_level && mask & mono_internal_current_mask)) {
86                 va_list args;
87                 va_start (args, format);
88                 mono_tracev_inner (level, mask, format, args);
89                 va_end (args);
90         }
91 }
92
93 #ifdef G_HAVE_ISO_VARARGS
94 #define mono_trace_error(...)   mono_trace(G_LOG_LEVEL_ERROR, \
95                                                                                         __VA_ARGS__)
96 #define mono_trace_warning(...) mono_trace(G_LOG_LEVEL_WARNING, \
97                                                                                         __VA_ARGS__)
98 #define mono_trace_message(...) mono_trace(G_LOG_LEVEL_MESSAGE, \
99                                                                                         __VA_ARGS__)
100 #elif defined(G_HAVE_GNUC_VARARGS)
101 #define mono_trace_error(format...)     mono_trace(G_LOG_LEVEL_ERROR, \
102                                                                                         format)
103 #define mono_trace_warning(format...) mono_trace(G_LOG_LEVEL_WARNING, \
104                                                                                         format)
105 #define mono_trace_message(format...) mono_trace(G_LOG_LEVEL_MESSAGE, \
106                                                                                         format)
107 #else /* no varargs macros */
108 G_GNUC_UNUSED static void
109 mono_trace_error(MonoTraceMask mask, const char *format, ...)
110 {
111         va_list args;
112         va_start (args, format);
113         mono_tracev(G_LOG_LEVEL_ERROR, mask, format, args);
114         va_end (args);
115 }
116
117 G_GNUC_UNUSED static void
118 mono_trace_warning(MonoTraceMask mask, const char *format, ...)
119 {
120         va_list args;
121         va_start (args, format);
122         mono_tracev(G_LOG_LEVEL_WARNING, mask, format, args);
123         va_end (args);
124 }
125
126 G_GNUC_UNUSED static void
127 mono_trace_message(MonoTraceMask mask, const char *format, ...)
128 {
129         va_list args;
130         va_start (args, format);
131         mono_tracev(G_LOG_LEVEL_MESSAGE, mask, format, args);
132         va_end (args);
133 }
134
135 #endif /* !__GNUC__ */
136
137 #if defined (PLATFORM_ANDROID) || (defined (TARGET_IOS) && defined (TARGET_IOS))
138
139 #define mono_gc_printf(gc_log_file, format, ...) g_log ("mono-gc", G_LOG_LEVEL_MESSAGE, format, ##__VA_ARGS__)
140 #define mono_runtime_printf(format, ...) g_log ("mono-rt", G_LOG_LEVEL_MESSAGE, format "\n", ##__VA_ARGS__)
141 #define mono_runtime_printf_err(format, ...) g_log ("mono-rt", G_LOG_LEVEL_CRITICAL, format "\n", ##__VA_ARGS__)
142 #define mono_profiler_printf(format, ...) g_log ("mono-prof", G_LOG_LEVEL_MESSAGE, format "\n", ##__VA_ARGS__)
143 #define mono_profiler_printf_err(format, ...) g_log ("mono-prof", G_LOG_LEVEL_CRITICAL, format "\n", ##__VA_ARGS__)
144 #define mono_runtime_stdout_fflush() do { } while (0)
145
146 #else
147
148 #define mono_gc_printf(gc_log_file, format, ...) do {   \
149         fprintf (gc_log_file, format, ##__VA_ARGS__);   \
150         fflush (gc_log_file);   \
151 } while (0)
152
153 #define mono_runtime_printf(format, ...) fprintf (stdout, format "\n", ##__VA_ARGS__)
154 #define mono_runtime_printf_err(format, ...) fprintf (stderr, format "\n", ##__VA_ARGS__)
155 #define mono_profiler_printf(format, ...) fprintf (stdout, format "\n", ##__VA_ARGS__)
156 #define mono_profiler_printf_err(format, ...) fprintf (stderr, format "\n", ##__VA_ARGS__)
157 #define mono_runtime_stdout_fflush() do { fflush (stdout); } while (0)
158
159 #endif
160
161 /* Internal logging API */
162 typedef void (*MonoLoggerOpen) (const char *, void *);
163 typedef void (*MonoLoggerWrite) (const char *, GLogLevelFlags, mono_bool, const char *);
164 typedef void (*MonoLoggerClose) (void);
165
166 typedef struct _MonoLogCallParm_ {
167         MonoLoggerOpen  opener;         /* Routine to open logging */
168         MonoLoggerWrite writer;         /* Routine to write log data */
169         MonoLoggerClose closer;         /* Routine to close logging */
170         char            *dest;          /* Log destination */
171         void            *user_data;     /* User data from legacy handler */
172         mono_bool       header;         /* Whether we want pid/time/date in log message */
173 } MonoLogCallParm;
174
175 void mono_trace_set_log_handler_internal (MonoLogCallParm *callback, void *user_data);
176 void mono_trace_set_logdest_string (const char *value);
177 void mono_trace_set_logheader_string (const char *value);
178
179 void mono_log_open_syslog (const char *, void *);
180 void mono_log_write_syslog (const char *, GLogLevelFlags, mono_bool, const char *);
181 void mono_log_close_syslog (void);
182
183 void mono_log_open_logfile (const char *, void *);
184 void mono_log_write_logfile (const char *, GLogLevelFlags, mono_bool, const char *);
185 void mono_log_close_logfile (void);
186
187 #if PLATFORM_ANDROID
188 void mono_log_open_logcat (const char *path, void *userData);
189 void mono_log_write_logcat (const char *log_domain, GLogLevelFlags level, mono_bool hdr, const char *message);
190 void mono_log_close_logcat (void);
191 #endif
192
193 #if defined(HOST_IOS)
194 void mono_log_open_asl (const char *path, void *userData);
195 void mono_log_write_asl (const char *log_domain, GLogLevelFlags level, mono_bool hdr, const char *message);
196 void mono_log_close_asl (void);
197
198 #endif
199
200 G_END_DECLS
201
202 #endif /* __MONO_LOGGER_INTERNAL_H__ */