xref: /third_party/eudev/src/shared/log.h (revision 99ca880a)
1/***
2  This file is part of eudev, forked from systemd.
3
4  Copyright 2010 Lennart Poettering
5
6  systemd is free software; you can redistribute it and/or modify it
7  under the terms of the GNU Lesser General Public License as published by
8  the Free Software Foundation; either version 2.1 of the License, or
9  (at your option) any later version.
10
11  systemd is distributed in the hope that it will be useful, but
12  WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Lesser General Public License for more details.
15
16  You should have received a copy of the GNU Lesser General Public License
17  along with systemd; If not, see <http://www.gnu.org/licenses/>.
18***/
19
20#pragma once
21
22#include <stdbool.h>
23#include <stdarg.h>
24#include <syslog.h>
25#include <errno.h>
26
27#include "macro.h"
28
29typedef enum LogTarget{
30        LOG_TARGET_CONSOLE,
31        LOG_TARGET_CONSOLE_PREFIXED,
32        LOG_TARGET_KMSG,
33        LOG_TARGET_JOURNAL,
34        LOG_TARGET_JOURNAL_OR_KMSG,
35        LOG_TARGET_SYSLOG,
36        LOG_TARGET_SYSLOG_OR_KMSG,
37        LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
38        LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */
39        LOG_TARGET_NULL,
40        _LOG_TARGET_MAX,
41        _LOG_TARGET_INVALID = -1
42}  LogTarget;
43
44void log_set_target(LogTarget target);
45void log_set_max_level(int level);
46int log_get_max_level(void) _pure_;
47
48int log_open(void);
49void log_close(void);
50
51void log_close_syslog(void);
52void log_close_journal(void);
53void log_close_kmsg(void);
54void log_close_console(void);
55
56int log_internal(
57                int level,
58                int error,
59                const char *file,
60                int line,
61                const char *func,
62                const char *format, ...) _printf_(6,7);
63
64int log_internalv(
65                int level,
66                int error,
67                const char *file,
68                int line,
69                const char *func,
70                const char *format,
71                va_list ap) _printf_(6,0);
72
73int log_oom_internal(
74                const char *file,
75                int line,
76                const char *func);
77
78/* Logging for various assertions */
79noreturn void log_assert_failed(
80                const char *text,
81                const char *file,
82                int line,
83                const char *func);
84
85noreturn void log_assert_failed_unreachable(
86                const char *text,
87                const char *file,
88                int line,
89                const char *func);
90
91
92/* Logging with level */
93#define log_full_errno(level, error, ...)                                         \
94        ({                                                                        \
95                int _l = (level), _e = (error);                                   \
96                (log_get_max_level() >= LOG_PRI(_l))                              \
97                ? log_internal(_l, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
98                : -abs(_e); \
99        })
100
101#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__)
102
103/* Normal logging */
104#define log_debug(...)     log_full(LOG_DEBUG,   __VA_ARGS__)
105#define log_info(...)      log_full(LOG_INFO,    __VA_ARGS__)
106#define log_notice(...)    log_full(LOG_NOTICE,  __VA_ARGS__)
107#define log_warning(...)   log_full(LOG_WARNING, __VA_ARGS__)
108#define log_error(...)     log_full(LOG_ERR,     __VA_ARGS__)
109#define log_emergency(...) log_full(getpid() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__)
110
111/* Logging triggered by an errno-like error */
112#define log_debug_errno(error, ...)     log_full_errno(LOG_DEBUG,   error, __VA_ARGS__)
113#define log_info_errno(error, ...)      log_full_errno(LOG_INFO,    error, __VA_ARGS__)
114#define log_notice_errno(error, ...)    log_full_errno(LOG_NOTICE,  error, __VA_ARGS__)
115#define log_warning_errno(error, ...)   log_full_errno(LOG_WARNING, error, __VA_ARGS__)
116#define log_error_errno(error, ...)     log_full_errno(LOG_ERR,     error, __VA_ARGS__)
117#define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__)
118
119#ifdef LOG_TRACE
120#  define log_trace(...) log_debug(__VA_ARGS__)
121#else
122#  define log_trace(...) do {} while(0)
123#endif
124
125/* This modifies the buffer passed! */
126
127#define log_oom() log_oom_internal(__FILE__, __LINE__, __func__)
128
129const char *log_target_to_string(LogTarget target) _const_;
130LogTarget log_target_from_string(const char *s) _pure_;
131