]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/log.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
19 #define O_CLOEXEC 02000000
22 #ifndef F_DUPFD_CLOEXEC
23 #define F_DUPFD_CLOEXEC 1030
26 #define LXC_LOG_PREFIX_SIZE 32
27 #define LXC_LOG_BUFFER_SIZE 4096
29 /* predefined lxc log priorities. */
43 /* location information of the logging event */
44 struct lxc_log_locinfo
{
50 #define LXC_LOG_LOCINFO_INIT \
51 { .file = __FILE__, .func = __func__, .line = __LINE__ }
53 /* brief logging event object */
54 struct lxc_log_event
{
57 struct timespec timestamp
;
58 struct lxc_log_locinfo
*locinfo
;
63 /* log appender object */
64 struct lxc_log_appender
{
66 int (*append
)(const struct lxc_log_appender
*, struct lxc_log_event
*);
69 * appenders can be stacked
71 struct lxc_log_appender
*next
;
74 /* log category object */
75 struct lxc_log_category
{
78 struct lxc_log_appender
*appender
;
79 const struct lxc_log_category
*parent
;
83 extern int lxc_log_use_global_fd
;
87 * Returns true if the chained priority is equal to or higher than
90 static inline int lxc_log_priority_is_enabled(const struct lxc_log_category
*category
,
93 while (category
->priority
== LXC_LOG_LEVEL_NOTSET
&& category
->parent
)
94 category
= category
->parent
;
96 int cmp_prio
= category
->priority
;
98 if (!lxc_log_use_global_fd
&& current_config
&&
99 current_config
->loglevel
!= LXC_LOG_LEVEL_NOTSET
)
100 cmp_prio
= current_config
->loglevel
;
103 return priority
>= cmp_prio
;
107 * converts a priority to a literal string
109 static inline const char *lxc_log_priority_to_string(int priority
)
112 case LXC_LOG_LEVEL_TRACE
:
114 case LXC_LOG_LEVEL_DEBUG
:
116 case LXC_LOG_LEVEL_INFO
:
118 case LXC_LOG_LEVEL_NOTICE
:
120 case LXC_LOG_LEVEL_WARN
:
122 case LXC_LOG_LEVEL_ERROR
:
124 case LXC_LOG_LEVEL_CRIT
:
126 case LXC_LOG_LEVEL_ALERT
:
128 case LXC_LOG_LEVEL_FATAL
:
135 static inline const char *lxc_syslog_priority_to_string(int priority
)
162 * converts a literal priority to an int
164 static inline int lxc_log_priority_to_int(const char *name
)
166 if (strcasecmp("TRACE", name
) == 0)
167 return LXC_LOG_LEVEL_TRACE
;
168 if (strcasecmp("DEBUG", name
) == 0)
169 return LXC_LOG_LEVEL_DEBUG
;
170 if (strcasecmp("INFO", name
) == 0)
171 return LXC_LOG_LEVEL_INFO
;
172 if (strcasecmp("NOTICE", name
) == 0)
173 return LXC_LOG_LEVEL_NOTICE
;
174 if (strcasecmp("WARN", name
) == 0)
175 return LXC_LOG_LEVEL_WARN
;
176 if (strcasecmp("ERROR", name
) == 0)
177 return LXC_LOG_LEVEL_ERROR
;
178 if (strcasecmp("CRIT", name
) == 0)
179 return LXC_LOG_LEVEL_CRIT
;
180 if (strcasecmp("ALERT", name
) == 0)
181 return LXC_LOG_LEVEL_ALERT
;
182 if (strcasecmp("FATAL", name
) == 0)
183 return LXC_LOG_LEVEL_FATAL
;
185 return LXC_LOG_LEVEL_NOTSET
;
188 static inline int lxc_syslog_priority_to_int(const char *name
)
190 if (strcasecmp("daemon", name
) == 0)
192 if (strcasecmp("local0", name
) == 0)
194 if (strcasecmp("local1", name
) == 0)
196 if (strcasecmp("local2", name
) == 0)
198 if (strcasecmp("local3", name
) == 0)
200 if (strcasecmp("local4", name
) == 0)
202 if (strcasecmp("local5", name
) == 0)
204 if (strcasecmp("local6", name
) == 0)
206 if (strcasecmp("local7", name
) == 0)
212 static inline void __lxc_log_append(const struct lxc_log_appender
*appender
,
213 struct lxc_log_event
*event
)
216 va_list *va_keep
= event
->vap
;
219 va_copy(va
, *va_keep
);
221 appender
->append(appender
, event
);
222 appender
= appender
->next
;
227 static inline void __lxc_log(const struct lxc_log_category
*category
,
228 struct lxc_log_event
*event
)
231 __lxc_log_append(category
->appender
, event
);
232 category
= category
->parent
;
237 * Helper macro to define log functions.
239 #define lxc_log_priority_define(acategory, LEVEL) \
241 __lxc_unused __attribute__ ((format (printf, 2, 3))) \
242 static inline void LXC_##LEVEL(struct lxc_log_locinfo *, const char *, ...); \
244 __lxc_unused static inline void LXC_##LEVEL(struct lxc_log_locinfo* locinfo, \
245 const char* format, ...) \
247 if (lxc_log_priority_is_enabled(acategory, LXC_LOG_LEVEL_##LEVEL)) { \
250 struct lxc_log_event evt = { \
251 .category = (acategory)->name, \
252 .priority = LXC_LOG_LEVEL_##LEVEL, \
257 /* clock_gettime() is explicitly marked as MT-Safe \
258 * without restrictions. So let's use it for our \
261 saved_errno = errno; \
262 (void)clock_gettime(CLOCK_REALTIME, &evt.timestamp); \
264 va_start(va_ref, format); \
266 __lxc_log(acategory, &evt); \
268 errno = saved_errno; \
273 * Helper macro to define and use static categories.
275 #define lxc_log_category_define(name, parent) \
276 extern struct lxc_log_category lxc_log_category_##parent; \
277 struct lxc_log_category lxc_log_category_##name = { \
279 LXC_LOG_LEVEL_NOTSET, \
281 &lxc_log_category_##parent \
284 #define lxc_log_define(name, parent) \
285 lxc_log_category_define(name, parent) \
287 lxc_log_priority_define(&lxc_log_category_##name, TRACE) \
288 lxc_log_priority_define(&lxc_log_category_##name, DEBUG) \
289 lxc_log_priority_define(&lxc_log_category_##name, INFO) \
290 lxc_log_priority_define(&lxc_log_category_##name, NOTICE) \
291 lxc_log_priority_define(&lxc_log_category_##name, WARN) \
292 lxc_log_priority_define(&lxc_log_category_##name, ERROR) \
293 lxc_log_priority_define(&lxc_log_category_##name, CRIT) \
294 lxc_log_priority_define(&lxc_log_category_##name, ALERT) \
295 lxc_log_priority_define(&lxc_log_category_##name, FATAL)
297 #define lxc_log_category_priority(name) \
298 (lxc_log_priority_to_string(lxc_log_category_##name.priority))
301 * Helper macro to define errno string.
304 #ifndef HAVE_DECL_STRERROR_R
305 #ifdef STRERROR_R_CHAR_P
306 char *strerror_r(int errnum
, char *buf
, size_t buflen
);
308 int strerror_r(int errnum
, char *buf
, size_t buflen
);
312 #ifdef STRERROR_R_CHAR_P
313 #define lxc_log_strerror_r \
314 char errno_buf[PATH_MAX / 2] = {"Failed to get errno string"}; \
317 int __saved_errno = errno; \
318 ptr = strerror_r(errno, errno_buf, sizeof(errno_buf)); \
319 errno = __saved_errno; \
324 #define lxc_log_strerror_r \
325 char errno_buf[PATH_MAX / 2] = {"Failed to get errno string"}; \
326 char *ptr = errno_buf; \
328 int __saved_errno = errno; \
329 (void)strerror_r(errno, errno_buf, sizeof(errno_buf)); \
330 errno = __saved_errno; \
333 #elif ENFORCE_THREAD_SAFETY
334 #error ENFORCE_THREAD_SAFETY was set but cannot be guaranteed
336 #define lxc_log_strerror_r \
339 ptr = strerror(errno); \
346 #define TRACE(format, ...) do { \
347 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
348 LXC_TRACE(&locinfo, format, ##__VA_ARGS__); \
351 #define DEBUG(format, ...) do { \
352 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
353 LXC_DEBUG(&locinfo, format, ##__VA_ARGS__); \
356 #define INFO(format, ...) do { \
357 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
358 LXC_INFO(&locinfo, format, ##__VA_ARGS__); \
361 #define NOTICE(format, ...) do { \
362 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
363 LXC_NOTICE(&locinfo, format, ##__VA_ARGS__); \
366 #define WARN(format, ...) do { \
367 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
368 LXC_WARN(&locinfo, format, ##__VA_ARGS__); \
371 #define ERROR(format, ...) do { \
372 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
373 LXC_ERROR(&locinfo, format, ##__VA_ARGS__); \
376 #define CRIT(format, ...) do { \
377 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
378 LXC_CRIT(&locinfo, format, ##__VA_ARGS__); \
381 #define ALERT(format, ...) do { \
382 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
383 LXC_ALERT(&locinfo, format, ##__VA_ARGS__); \
386 #define FATAL(format, ...) do { \
387 struct lxc_log_locinfo locinfo = LXC_LOG_LOCINFO_INIT; \
388 LXC_FATAL(&locinfo, format, ##__VA_ARGS__); \
392 #define SYSTRACE(format, ...) \
393 TRACE("%m - " format, ##__VA_ARGS__)
395 #define SYSTRACE(format, ...) \
397 lxc_log_strerror_r; \
398 TRACE("%s - " format, ptr, ##__VA_ARGS__); \
403 #define SYSDEBUG(format, ...) \
404 DEBUG("%m - " format, ##__VA_ARGS__)
406 #define SYSDEBUG(format, ...) \
408 lxc_log_strerror_r; \
409 DEBUG("%s - " format, ptr, ##__VA_ARGS__); \
415 #define SYSINFO(format, ...) \
416 INFO("%m - " format, ##__VA_ARGS__)
418 #define SYSINFO(format, ...) \
420 lxc_log_strerror_r; \
421 INFO("%s - " format, ptr, ##__VA_ARGS__); \
426 #define SYSNOTICE(format, ...) \
427 NOTICE("%m - " format, ##__VA_ARGS__)
429 #define SYSNOTICE(format, ...) \
431 lxc_log_strerror_r; \
432 NOTICE("%s - " format, ptr, ##__VA_ARGS__); \
437 #define SYSWARN(format, ...) \
438 WARN("%m - " format, ##__VA_ARGS__)
440 #define SYSWARN(format, ...) \
442 lxc_log_strerror_r; \
443 WARN("%s - " format, ptr, ##__VA_ARGS__); \
448 #define SYSERROR(format, ...) \
449 ERROR("%m - " format, ##__VA_ARGS__)
451 #define SYSERROR(format, ...) \
453 lxc_log_strerror_r; \
454 ERROR("%s - " format, ptr, ##__VA_ARGS__); \
459 #define CMD_SYSERROR(format, ...) \
460 fprintf(stderr, "%m - " format, ##__VA_ARGS__)
462 #define CMD_SYSERROR(format, ...) \
464 lxc_log_strerror_r; \
465 fprintf(stderr, "%s - " format, ptr, ##__VA_ARGS__); \
470 #define CMD_SYSINFO(format, ...) \
471 printf("%m - " format, ##__VA_ARGS__)
473 #define CMD_SYSINFO(format, ...) \
475 lxc_log_strerror_r; \
476 printf("%s - " format, ptr, ##__VA_ARGS__); \
480 #define log_error_errno(__ret__, __errno__, format, ...) \
483 SYSERROR(format, ##__VA_ARGS__); \
487 #define log_error(__ret__, format, ...) \
489 ERROR(format, ##__VA_ARGS__); \
493 #define log_trace_errno(__ret__, __errno__, format, ...) \
496 SYSTRACE(format, ##__VA_ARGS__); \
500 #define log_trace(__ret__, format, ...) \
502 TRACE(format, ##__VA_ARGS__); \
506 #define log_warn_errno(__ret__, __errno__, format, ...) \
509 SYSWARN(format, ##__VA_ARGS__); \
513 #define log_warn(__ret__, format, ...) \
515 WARN(format, ##__VA_ARGS__); \
519 #define log_debug_errno(__ret__, __errno__, format, ...) \
522 SYSDEBUG(format, ##__VA_ARGS__); \
526 #define log_debug(__ret__, format, ...) \
528 DEBUG(format, ##__VA_ARGS__); \
532 #define log_info_errno(__ret__, __errno__, format, ...) \
535 SYSINFO(format, ##__VA_ARGS__); \
539 #define log_info(__ret__, format, ...) \
541 INFO(format, ##__VA_ARGS__); \
545 extern int lxc_log_fd
;
547 extern int lxc_log_syslog(int facility
);
548 extern void lxc_log_enable_syslog(void);
549 extern int lxc_log_set_level(int *dest
, int level
);
550 extern int lxc_log_get_level(void);
551 extern bool lxc_log_has_valid_level(void);
552 extern int lxc_log_set_file(int *fd
, const char *fname
);
553 extern const char *lxc_log_get_file(void);
554 extern void lxc_log_set_prefix(const char *prefix
);
555 extern const char *lxc_log_get_prefix(void);
556 extern void lxc_log_options_no_override(void);