37
38
#define LOGSYS_H_DEFINED
39
40
#include <stdarg.h>
40
42
#include <syslog.h>
44
* MODE_OUTPUT_SYSLOG_* modes are mutually exclusive
51
* All of the LOGSYS_MODE's can be ORed together for combined behavior
53
* FORK and THREADED are ignored for SUBSYSTEMS
46
#define LOG_MODE_OUTPUT_FILE (1<<0)
47
#define LOG_MODE_OUTPUT_STDERR (1<<1)
48
#define LOG_MODE_OUTPUT_SYSLOG_THREADED (1<<2)
49
#define LOG_MODE_OUTPUT_SYSLOG_LOSSY (1<<3)
50
#define LOG_MODE_OUTPUT_SYSLOG_BLOCKING (1<<4)
51
#define LOG_MODE_DISPLAY_PRIORITY (1<<5)
52
#define LOG_MODE_DISPLAY_FILELINE (1<<6)
53
#define LOG_MODE_DISPLAY_TIMESTAMP (1<<7)
54
#define LOG_MODE_BUFFER_BEFORE_CONFIG (1<<8)
55
#define LOG_MODE_FLUSH_AFTER_CONFIG (1<<9)
56
#define LOG_MODE_SHORT_FILELINE (1<<10)
57
#define LOG_MODE_NOSUBSYS (1<<11)
58
#define LOG_MODE_FILTER_DEBUG_FROM_SYSLOG (1<<12)
55
#define LOGSYS_MODE_OUTPUT_FILE (1<<0)
56
#define LOGSYS_MODE_OUTPUT_STDERR (1<<1)
57
#define LOGSYS_MODE_OUTPUT_SYSLOG (1<<2)
58
#define LOGSYS_MODE_FORK (1<<3)
59
#define LOGSYS_MODE_THREADED (1<<4)
61
62
* Log priorities, compliant with syslog and SA Forum Log spec.
63
#define LOG_LEVEL_EMERG LOG_EMERG
64
#define LOG_LEVEL_ALERT LOG_ALERT
65
#define LOG_LEVEL_CRIT LOG_CRIT
66
#define LOG_LEVEL_ERROR LOG_ERR
67
#define LOG_LEVEL_WARNING LOG_WARNING
68
#define LOG_LEVEL_SECURITY LOG_WARNING // corosync specific
69
#define LOG_LEVEL_NOTICE LOG_NOTICE
70
#define LOG_LEVEL_INFO LOG_INFO
71
#define LOG_LEVEL_DEBUG LOG_DEBUG
74
** Log tags, used by _logsys_trace macros, uses 32 bits => 32 different tags
76
#define LOGSYS_TAG_LOG (1<<0)
77
#define LOGSYS_TAG_ENTER (1<<1)
78
#define LOGSYS_TAG_LEAVE (1<<2)
79
#define LOGSYS_TAG_TRACE1 (1<<3)
80
#define LOGSYS_TAG_TRACE2 (1<<4)
81
#define LOGSYS_TAG_TRACE3 (1<<5)
82
#define LOGSYS_TAG_TRACE4 (1<<6)
83
#define LOGSYS_TAG_TRACE5 (1<<7)
84
#define LOGSYS_TAG_TRACE6 (1<<8)
85
#define LOGSYS_TAG_TRACE7 (1<<9)
86
#define LOGSYS_TAG_TRACE8 (1<<10)
92
struct logsys_logger {
94
unsigned int priority;
99
extern struct logsys_logger logsys_loggers[];
101
extern int logsys_single_id;
103
extern inline int logsys_mkpri (int priority, int id);
105
extern void logsys_config_mode_set (
64
#define LOGSYS_LEVEL_EMERG LOG_EMERG
65
#define LOGSYS_LEVEL_ALERT LOG_ALERT
66
#define LOGSYS_LEVEL_CRIT LOG_CRIT
67
#define LOGSYS_LEVEL_ERROR LOG_ERR
68
#define LOGSYS_LEVEL_WARNING LOG_WARNING
69
#define LOGSYS_LEVEL_NOTICE LOG_NOTICE
70
#define LOGSYS_LEVEL_INFO LOG_INFO
71
#define LOGSYS_LEVEL_DEBUG LOG_DEBUG
74
* All of the LOGSYS_RECID's are mutually exclusive. Only one RECID at any time
77
* RECID_LOG indicates a message that should be sent to log. Anything else
78
* is stored only in the flight recorder.
81
#define LOGSYS_RECID_MAX ((UINT_MAX) >> LOGSYS_SUBSYSID_END)
83
#define LOGSYS_RECID_LOG (LOGSYS_RECID_MAX - 1)
84
#define LOGSYS_RECID_ENTER (LOGSYS_RECID_MAX - 2)
85
#define LOGSYS_RECID_LEAVE (LOGSYS_RECID_MAX - 3)
86
#define LOGSYS_RECID_TRACE1 (LOGSYS_RECID_MAX - 4)
87
#define LOGSYS_RECID_TRACE2 (LOGSYS_RECID_MAX - 5)
88
#define LOGSYS_RECID_TRACE3 (LOGSYS_RECID_MAX - 6)
89
#define LOGSYS_RECID_TRACE4 (LOGSYS_RECID_MAX - 7)
90
#define LOGSYS_RECID_TRACE5 (LOGSYS_RECID_MAX - 8)
91
#define LOGSYS_RECID_TRACE6 (LOGSYS_RECID_MAX - 9)
92
#define LOGSYS_RECID_TRACE7 (LOGSYS_RECID_MAX - 10)
93
#define LOGSYS_RECID_TRACE8 (LOGSYS_RECID_MAX - 11)
97
* Internal APIs that must be globally exported
98
* (External API below)
104
* SUBSYS_COUNT defines the maximum number of subsystems
105
* SUBSYS_NAMELEN defines the maximum len of a subsystem name
107
#define LOGSYS_MAX_SUBSYS_COUNT 64
108
#define LOGSYS_MAX_SUBSYS_NAMELEN 64
111
* rec_ident explained:
113
* rec_ident is an unsigned int and carries bitfields information
114
* on subsys_id, log priority (level) and type of message (RECID).
116
* level values are imported from syslog.h.
117
* At the time of writing it's a 3 bits value (0 to 7).
119
* subsys_id is any value between 0 and 64 (LOGSYS_MAX_SUBSYS_COUNT)
121
* RECID identifies the type of message. A set of predefined values
122
* are available via logsys, but other custom values can be defined
133
#define LOGSYS_LEVEL_END (3)
134
#define LOGSYS_SUBSYSID_END (LOGSYS_LEVEL_END + 7)
136
#define LOGSYS_RECID_LEVEL_MASK (LOG_PRIMASK)
137
#define LOGSYS_RECID_SUBSYSID_MASK ((2 << (LOGSYS_SUBSYSID_END - 1)) - \
139
#define LOGSYS_RECID_RECID_MASK (UINT_MAX - \
140
(LOGSYS_RECID_SUBSYSID_MASK + LOG_PRIMASK))
142
#define LOGSYS_ENCODE_RECID(level,subsysid,recid) \
143
(((recid) << LOGSYS_SUBSYSID_END) | \
144
((subsysid) << LOGSYS_LEVEL_END) | \
147
#define LOGSYS_DECODE_LEVEL(rec_ident) \
148
((rec_ident) & LOGSYS_RECID_LEVEL_MASK)
150
#define LOGSYS_DECODE_SUBSYSID(rec_ident) \
151
(((rec_ident) & LOGSYS_RECID_SUBSYSID_MASK) >> LOGSYS_LEVEL_END)
153
#define LOGSYS_DECODE_RECID(rec_ident) \
154
(((rec_ident) & LOGSYS_RECID_RECID_MASK) >> LOGSYS_SUBSYSID_END)
156
#ifndef LOGSYS_UTILS_ONLY
158
extern int _logsys_system_setup(
159
const char *mainsystem,
163
int logfile_priority,
165
int syslog_priority);
167
extern int _logsys_config_subsys_get (
170
extern unsigned int _logsys_subsys_create (const char *subsys);
172
extern int _logsys_rec_init (unsigned int size);
174
extern void _logsys_log_vprintf (
175
unsigned int rec_ident,
176
const char *function_name,
177
const char *file_name,
180
va_list ap) __attribute__((format(printf, 5, 0)));
182
extern void _logsys_log_printf (
183
unsigned int rec_ident,
184
const char *function_name,
185
const char *file_name,
188
...) __attribute__((format(printf, 5, 6)));
190
extern void _logsys_log_rec (
191
unsigned int rec_ident,
192
const char *function_name,
193
const char *file_name,
197
extern int _logsys_wthread_create (void);
199
static int logsys_subsys_id __attribute__((unused)) = LOGSYS_MAX_SUBSYS_COUNT;
202
* External API - init
205
* LOGSYS_DECLARE_SYSTEM
206
* LOGSYS_DECLARE_SUBSYS
209
extern void logsys_fork_completed (void);
211
extern void logsys_atexit (void);
214
* External API - misc
216
extern void logsys_flush (void);
218
extern int logsys_log_rec_store (const char *filename);
221
* External API - configuration
225
* configuration bits that can only be done for the whole system
227
extern int logsys_format_set (
230
extern char *logsys_format_get (void);
233
* per system/subsystem settings.
235
* NOTE: once a subsystem is created and configured, changing
236
* the default does NOT affect the subsystems.
238
* Pass a NULL subsystem to change them all
240
extern unsigned int logsys_config_syslog_facility_set (
242
unsigned int facility);
244
extern unsigned int logsys_config_syslog_priority_set (
246
unsigned int priority);
248
extern unsigned int logsys_config_mode_set (
106
250
unsigned int mode);
108
extern unsigned int logsys_config_mode_get (void);
252
extern unsigned int logsys_config_mode_get (
256
* to close a logfile, just invoke this function with a NULL
257
* file or if you want to change logfile, the old one will
110
260
extern int logsys_config_file_set (
114
extern void logsys_config_facility_set (
116
unsigned int facility);
118
extern unsigned int logsys_config_subsys_set (
262
const char **error_string,
265
extern unsigned int logsys_config_logfile_priority_set (
121
267
unsigned int priority);
123
extern int logsys_config_subsys_get (
270
* enabling debug, disable message priority filtering.
271
* everything is sent everywhere. priority values
272
* for file and syslog are not overwritten.
274
extern unsigned int logsys_config_debug_set (
124
275
const char *subsys,
126
unsigned int *priority);
279
* External API - helpers
281
* convert facility/priority to/from name/values
128
283
extern int logsys_facility_id_get (
129
284
const char *name);
137
292
extern const char *logsys_priority_name_get (
138
293
unsigned int priority);
140
extern void logsys_flush (void);
142
extern void logsys_atsegv (void);
145
* Internal APIs that must be globally exported
147
extern unsigned int _logsys_subsys_create (const char *ident,
148
unsigned int priority);
150
extern void _logsys_nosubsys_set (void);
152
extern int _logsys_wthread_create (void);
154
extern void logsys_log_printf (char *file, int line, int priority,
155
char *format, ...) __attribute__((format(printf, 4, 5)));
157
extern void _logsys_log_printf2 (char *file, int line, int priority,
158
int id, char *format, ...) __attribute__((format(printf, 5, 6)));
160
extern void _logsys_trace (char *file, int line, int tag, int id,
161
char *format, ...) __attribute__((format(printf, 5, 6)));
295
extern int logsys_thread_priority_set (
297
const struct sched_param *param,
298
unsigned int after_log_ops_yield);
164
301
* External definitions
166
#define LOGSYS_DECLARE_SYSTEM(name,mode,file,facility) \
167
__attribute__ ((constructor)) static void logsys_system_init (void) \
303
extern void *logsys_rec_end;
305
#define LOGSYS_REC_END (&logsys_rec_end)
307
#define LOGSYS_DECLARE_SYSTEM(name,mode,debug,file,file_priority, \
308
syslog_facility,syslog_priority,format,fltsize) \
309
__attribute__ ((constructor)) \
310
static void logsys_system_init (void) \
169
char *error_string; \
171
logsys_config_mode_set (mode); \
172
logsys_config_file_set (&error_string, (file)); \
173
logsys_config_facility_set (name, (facility)); \
174
if (((mode) & LOG_MODE_BUFFER_BEFORE_CONFIG) == 0) { \
175
_logsys_wthread_create (); \
312
if (_logsys_system_setup (name,mode,debug,file,file_priority, \
313
syslog_facility,syslog_priority) < 0) { \
315
"Unable to setup logging system: %s.\n", name); \
319
if (logsys_format_set (format) < 0) { \
321
"Unable to setup logging format.\n"); \
325
if (_logsys_rec_init (fltsize) < 0) { \
327
"Unable to initialize log flight recorder.\n"); \
331
if (_logsys_wthread_create() < 0) { \
333
"Unable to initialize logging thread.\n"); \
179
static unsigned int logsys_subsys_id __attribute__((unused)) = -1; \
181
#define LOGSYS_DECLARE_NOSUBSYS(priority) \
182
__attribute__ ((constructor)) static void logsys_nosubsys_init (void) \
338
#define LOGSYS_DECLARE_SUBSYS(subsys) \
339
__attribute__ ((constructor)) \
340
static void logsys_subsys_init (void) \
184
unsigned int pri, tags; \
186
342
logsys_subsys_id = \
187
logsys_config_subsys_get("MAIN", &tags, &pri); \
343
_logsys_subsys_create ((subsys)); \
189
344
if (logsys_subsys_id == -1) { \
190
_logsys_nosubsys_set(); \
192
_logsys_subsys_create ("MAIN", (priority)); \
196
#define LOGSYS_DECLARE_SUBSYS(subsys,priority) \
197
__attribute__ ((constructor)) static void logsys_subsys_init (void) \
199
unsigned int pri, tags; \
202
logsys_config_subsys_get((subsys), &tags, &pri); \
204
if (logsys_subsys_id == -1) \
206
_logsys_subsys_create ((subsys), (priority)); \
209
#define log_printf(lvl, format, args...) do { \
210
if (logsys_single_id) \
211
logsys_subsys_id = 0; \
212
assert (logsys_subsys_id != -1); \
213
if ((lvl) <= logsys_loggers[logsys_subsys_id].priority) { \
214
_logsys_log_printf2 (__FILE__, __LINE__, lvl, \
215
logsys_subsys_id, (format), ##args); \
219
#define dprintf(format, args...) do { \
220
if (logsys_single_id) \
221
logsys_subsys_id = 0; \
222
assert (logsys_subsys_id != -1); \
223
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
224
_logsys_log_printf2 (__FILE__, __LINE__, LOG_DEBUG, \
225
logsys_subsys_id, (format), ##args); \
229
#define ENTER_VOID() do { \
230
if (logsys_single_id) \
231
logsys_subsys_id = 0; \
232
assert (logsys_subsys_id != -1); \
233
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
234
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_ENTER, \
235
logsys_subsys_id, ">%s\n", __FUNCTION__); \
239
#define ENTER(format, args...) do { \
240
if (logsys_single_id) \
241
logsys_subsys_id = 0; \
242
assert (logsys_subsys_id != -1); \
243
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
244
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_ENTER, \
245
logsys_subsys_id, ">%s: " format, __FUNCTION__, \
250
#define LEAVE_VOID() do { \
251
if (logsys_single_id) \
252
logsys_subsys_id = 0; \
253
assert (logsys_subsys_id != -1); \
254
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
255
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_LEAVE, \
256
logsys_subsys_id, "<%s\n", __FUNCTION__); \
260
#define LEAVE(format, args...) do { \
261
if (logsys_single_id) \
262
logsys_subsys_id = 0; \
263
assert (logsys_subsys_id != -1); \
264
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
265
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_LEAVE, \
266
logsys_subsys_id, "<%s: " format, \
267
__FUNCTION__, ##args); \
346
"Unable to create logging subsystem: %s.\n", subsys); \
351
#define log_rec(rec_ident, args...) \
353
_logsys_log_rec (rec_ident, __FUNCTION__, \
354
__FILE__, __LINE__, ##args, \
358
#define log_printf(level, format, args...) \
360
_logsys_log_printf ( \
361
LOGSYS_ENCODE_RECID(level, \
364
__FUNCTION__, __FILE__, __LINE__, \
368
#define ENTER() do { \
370
LOGSYS_ENCODE_RECID(LOGSYS_LEVEL_DEBUG, \
372
LOGSYS_RECID_ENTER), \
373
__FUNCTION__, __FILE__, __LINE__, LOGSYS_REC_END); \
376
#define LEAVE() do { \
378
LOGSYS_ENCODE_RECID(LOGSYS_LEVEL_DEBUG, \
380
LOGSYS_RECID_LEAVE), \
381
__FUNCTION__, __FILE__, __LINE__, LOGSYS_REC_END); \
384
#define TRACE(recid, format, args...) do { \
385
_logsys_log_printf ( \
386
LOGSYS_ENCODE_RECID(LOGSYS_LEVEL_DEBUG, \
389
__FUNCTION__, __FILE__, __LINE__, \
271
393
#define TRACE1(format, args...) do { \
272
if (logsys_single_id) \
273
logsys_subsys_id = 0; \
274
assert (logsys_subsys_id != -1); \
275
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
276
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE1, \
277
logsys_subsys_id, (format), ##args); \
394
TRACE(LOGSYS_RECID_TRACE1, format, ##args); \
281
397
#define TRACE2(format, args...) do { \
282
if (logsys_single_id) \
283
logsys_subsys_id = 0; \
284
assert (logsys_subsys_id != -1); \
285
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
286
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE2, \
287
logsys_subsys_id, (format), ##args); \
291
#define TRACE3(format, args...) do { \
292
if (logsys_single_id) \
293
logsys_subsys_id = 0; \
294
assert (logsys_subsys_id != -1); \
295
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
296
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE3, \
297
logsys_subsys_id, (format), ##args); \
301
#define TRACE4(format, args...) do { \
302
if (logsys_single_id) \
303
logsys_subsys_id = 0; \
304
assert (logsys_subsys_id != -1); \
305
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
306
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE4, \
307
logsys_subsys_id, (format), ##args); \
398
TRACE(LOGSYS_RECID_TRACE2, format, ##args); \
401
#define TRACE3(format, args...) do { \
402
TRACE(LOGSYS_RECID_TRACE3, format, ##args); \
405
#define TRACE4(format, args...) do { \
406
TRACE(LOGSYS_RECID_TRACE4, format, ##args); \
311
409
#define TRACE5(format, args...) do { \
312
if (logsys_single_id) \
313
logsys_subsys_id = 0; \
314
assert (logsys_subsys_id != -1); \
315
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
316
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE5, \
317
logsys_subsys_id, (format), ##args); \
410
TRACE(LOGSYS_RECID_TRACE5, format, ##args); \
321
413
#define TRACE6(format, args...) do { \
322
if (logsys_single_id) \
323
logsys_subsys_id = 0; \
324
assert (logsys_subsys_id != -1); \
325
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
326
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE6, \
327
logsys_subsys_id, (format), ##args); \
414
TRACE(LOGSYS_RECID_TRACE6, format, ##args); \
331
417
#define TRACE7(format, args...) do { \
332
if (logsys_single_id) \
333
logsys_subsys_id = 0; \
334
assert (logsys_subsys_id != -1); \
335
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
336
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE7, \
337
logsys_subsys_id, (format), ##args); \
418
TRACE(LOGSYS_RECID_TRACE7, format, ##args); \
341
421
#define TRACE8(format, args...) do { \
342
if (logsys_single_id) \
343
logsys_subsys_id = 0; \
344
assert (logsys_subsys_id != -1); \
345
if (LOG_LEVEL_DEBUG <= logsys_loggers[logsys_subsys_id].priority) { \
346
_logsys_trace (__FILE__, __LINE__, LOGSYS_TAG_TRACE8, \
347
logsys_subsys_id, (format), ##args); \
351
extern void _logsys_config_priority_set (unsigned int id, unsigned int priority);
353
#define logsys_config_priority_set(priority) do { \
354
if (logsys_single_id) \
355
logsys_subsys_id = 0; \
356
assert (logsys_subsys_id != -1); \
357
_logsys_config_priority_set (logsys_subsys_id, priority); \
360
/* simple, function-based api */
362
int logsys_init (char *name, int mode, int facility, int priority, char *file);
363
int logsys_conf (char *name, int mode, int facility, int priority, char *file);
364
void logsys_exit (void);
422
TRACE(LOGSYS_RECID_TRACE8, format, ##args); \
425
#endif /* LOGSYS_UTILS_ONLY */
366
431
#endif /* LOGSYS_H_DEFINED */