]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/log.h
basic/log: fix _printf_ annotation on log_object_internalv
[thirdparty/systemd.git] / src / basic / log.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <errno.h>
23 #include <stdarg.h>
24 #include <stdbool.h>
25 #include <stdlib.h>
26 #include <sys/signalfd.h>
27 #include <sys/socket.h>
28 #include <syslog.h>
29
30 #include "sd-id128.h"
31
32 #include "macro.h"
33
34 typedef enum LogTarget{
35 LOG_TARGET_CONSOLE,
36 LOG_TARGET_CONSOLE_PREFIXED,
37 LOG_TARGET_KMSG,
38 LOG_TARGET_JOURNAL,
39 LOG_TARGET_JOURNAL_OR_KMSG,
40 LOG_TARGET_SYSLOG,
41 LOG_TARGET_SYSLOG_OR_KMSG,
42 LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
43 LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */
44 LOG_TARGET_NULL,
45 _LOG_TARGET_MAX,
46 _LOG_TARGET_INVALID = -1
47 } LogTarget;
48
49 void log_set_target(LogTarget target);
50 void log_set_max_level(int level);
51 void log_set_facility(int facility);
52
53 int log_set_target_from_string(const char *e);
54 int log_set_max_level_from_string(const char *e);
55
56 void log_show_color(bool b);
57 bool log_get_show_color(void) _pure_;
58 void log_show_location(bool b);
59 bool log_get_show_location(void) _pure_;
60
61 int log_show_color_from_string(const char *e);
62 int log_show_location_from_string(const char *e);
63
64 LogTarget log_get_target(void) _pure_;
65 int log_get_max_level(void) _pure_;
66
67 int log_open(void);
68 void log_close(void);
69 void log_forget_fds(void);
70
71 void log_close_syslog(void);
72 void log_close_journal(void);
73 void log_close_kmsg(void);
74 void log_close_console(void);
75
76 void log_parse_environment(void);
77
78 int log_internal(
79 int level,
80 int error,
81 const char *file,
82 int line,
83 const char *func,
84 const char *format, ...) _printf_(6,7);
85
86 int log_internalv(
87 int level,
88 int error,
89 const char *file,
90 int line,
91 const char *func,
92 const char *format,
93 va_list ap) _printf_(6,0);
94
95 int log_object_internal(
96 int level,
97 int error,
98 const char *file,
99 int line,
100 const char *func,
101 const char *object_field,
102 const char *object,
103 const char *extra_field,
104 const char *extra,
105 const char *format, ...) _printf_(10,11);
106
107 int log_object_internalv(
108 int level,
109 int error,
110 const char *file,
111 int line,
112 const char *func,
113 const char *object_field,
114 const char *object,
115 const char *extra_field,
116 const char *extra,
117 const char *format,
118 va_list ap) _printf_(10,0);
119
120 int log_struct_internal(
121 int level,
122 int error,
123 const char *file,
124 int line,
125 const char *func,
126 const char *format, ...) _printf_(6,0) _sentinel_;
127
128 int log_oom_internal(
129 const char *file,
130 int line,
131 const char *func);
132
133 int log_format_iovec(
134 struct iovec *iovec,
135 unsigned iovec_len,
136 unsigned *n,
137 bool newline_separator,
138 int error,
139 const char *format,
140 va_list ap);
141
142 /* This modifies the buffer passed! */
143 int log_dump_internal(
144 int level,
145 int error,
146 const char *file,
147 int line,
148 const char *func,
149 char *buffer);
150
151 /* Logging for various assertions */
152 noreturn void log_assert_failed(
153 const char *text,
154 const char *file,
155 int line,
156 const char *func);
157
158 noreturn void log_assert_failed_unreachable(
159 const char *text,
160 const char *file,
161 int line,
162 const char *func);
163
164 void log_assert_failed_return(
165 const char *text,
166 const char *file,
167 int line,
168 const char *func);
169
170 /* Logging with level */
171 #define log_full_errno(level, error, ...) \
172 ({ \
173 int _level = (level), _e = (error); \
174 (log_get_max_level() >= LOG_PRI(_level)) \
175 ? log_internal(_level, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
176 : -abs(_e); \
177 })
178
179 #define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__)
180
181 /* Normal logging */
182 #define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__)
183 #define log_info(...) log_full(LOG_INFO, __VA_ARGS__)
184 #define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__)
185 #define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__)
186 #define log_error(...) log_full(LOG_ERR, __VA_ARGS__)
187 #define log_emergency(...) log_full(getpid() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__)
188
189 /* Logging triggered by an errno-like error */
190 #define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__)
191 #define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__)
192 #define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__)
193 #define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__)
194 #define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__)
195 #define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__)
196
197 #ifdef LOG_TRACE
198 # define log_trace(...) log_debug(__VA_ARGS__)
199 #else
200 # define log_trace(...) do {} while (0)
201 #endif
202
203 /* Structured logging */
204 #define log_struct(level, ...) log_struct_internal(level, 0, __FILE__, __LINE__, __func__, __VA_ARGS__)
205 #define log_struct_errno(level, error, ...) log_struct_internal(level, error, __FILE__, __LINE__, __func__, __VA_ARGS__)
206
207 /* This modifies the buffer passed! */
208 #define log_dump(level, buffer) log_dump_internal(level, 0, __FILE__, __LINE__, __func__, buffer)
209
210 #define log_oom() log_oom_internal(__FILE__, __LINE__, __func__)
211
212 bool log_on_console(void) _pure_;
213
214 const char *log_target_to_string(LogTarget target) _const_;
215 LogTarget log_target_from_string(const char *s) _pure_;
216
217 /* Helper to prepare various field for structured logging */
218 #define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__
219
220 void log_received_signal(int level, const struct signalfd_siginfo *si);
221
222 void log_set_upgrade_syslog_to_journal(bool b);
223 void log_set_always_reopen_console(bool b);
224
225 int log_syntax_internal(
226 const char *unit,
227 int level,
228 const char *config_file,
229 unsigned config_line,
230 int error,
231 const char *file,
232 int line,
233 const char *func,
234 const char *format, ...) _printf_(9, 10);
235
236 #define log_syntax(unit, level, config_file, config_line, error, ...) \
237 ({ \
238 int _level = (level), _e = (error); \
239 (log_get_max_level() >= LOG_PRI(_level)) \
240 ? log_syntax_internal(unit, _level, config_file, config_line, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
241 : -abs(_e); \
242 })
243
244 #define log_syntax_invalid_utf8(unit, level, config_file, config_line, rvalue) \
245 ({ \
246 int _level = (level); \
247 if (log_get_max_level() >= LOG_PRI(_level)) { \
248 _cleanup_free_ char *_p = NULL; \
249 _p = utf8_escape_invalid(rvalue); \
250 log_syntax_internal(unit, _level, config_file, config_line, 0, __FILE__, __LINE__, __func__, \
251 "String is not UTF-8 clean, ignoring assignment: %s", strna(_p)); \
252 } \
253 })