]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/log.h
Merge pull request #7990 from poettering/log-deadlock
[thirdparty/systemd.git] / src / basic / log.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 /***
5 This file is part of systemd.
6
7 Copyright 2010 Lennart Poettering
8
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
13
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 ***/
22
23 #include <stdarg.h>
24 #include <stdbool.h>
25 #include <stdlib.h>
26 #include <syslog.h>
27
28 #include "macro.h"
29
30 /* Some structures we reference but don't want to pull in headers for */
31 struct iovec;
32 struct signalfd_siginfo;
33
34 typedef enum LogRealm {
35 LOG_REALM_SYSTEMD,
36 LOG_REALM_UDEV,
37 _LOG_REALM_MAX,
38 } LogRealm;
39
40 #ifndef LOG_REALM
41 # define LOG_REALM LOG_REALM_SYSTEMD
42 #endif
43
44 typedef enum LogTarget{
45 LOG_TARGET_CONSOLE,
46 LOG_TARGET_CONSOLE_PREFIXED,
47 LOG_TARGET_KMSG,
48 LOG_TARGET_JOURNAL,
49 LOG_TARGET_JOURNAL_OR_KMSG,
50 LOG_TARGET_SYSLOG,
51 LOG_TARGET_SYSLOG_OR_KMSG,
52 LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
53 LOG_TARGET_NULL,
54 _LOG_TARGET_MAX,
55 _LOG_TARGET_INVALID = -1
56 } LogTarget;
57
58 #define LOG_REALM_PLUS_LEVEL(realm, level) \
59 ((realm) << 10 | (level))
60 #define LOG_REALM_REMOVE_LEVEL(realm_level) \
61 ((realm_level >> 10))
62
63 void log_set_target(LogTarget target);
64 void log_set_max_level_realm(LogRealm realm, int level);
65 #define log_set_max_level(level) \
66 log_set_max_level_realm(LOG_REALM, (level))
67
68 void log_set_facility(int facility);
69
70 int log_set_target_from_string(const char *e);
71 int log_set_max_level_from_string_realm(LogRealm realm, const char *e);
72 #define log_set_max_level_from_string(e) \
73 log_set_max_level_from_string_realm(LOG_REALM, (e))
74
75 void log_show_color(bool b);
76 bool log_get_show_color(void) _pure_;
77 void log_show_location(bool b);
78 bool log_get_show_location(void) _pure_;
79
80 int log_show_color_from_string(const char *e);
81 int log_show_location_from_string(const char *e);
82
83 LogTarget log_get_target(void) _pure_;
84 int log_get_max_level_realm(LogRealm realm) _pure_;
85 #define log_get_max_level() \
86 log_get_max_level_realm(LOG_REALM)
87
88 /* Functions below that open and close logs or configure logging based on the
89 * environment should not be called from library code — this is always a job
90 * for the application itself.
91 */
92
93 int log_open(void);
94 void log_close(void);
95 void log_forget_fds(void);
96
97 void log_close_syslog(void);
98 void log_close_journal(void);
99 void log_close_kmsg(void);
100 void log_close_console(void);
101
102 void log_parse_environment_realm(LogRealm realm);
103 #define log_parse_environment() \
104 log_parse_environment_realm(LOG_REALM)
105
106 int log_dispatch_internal(
107 int level,
108 int error,
109 const char *file,
110 int line,
111 const char *func,
112 const char *object_field,
113 const char *object,
114 const char *extra,
115 const char *extra_field,
116 char *buffer);
117
118 int log_internal_realm(
119 int level,
120 int error,
121 const char *file,
122 int line,
123 const char *func,
124 const char *format, ...) _printf_(6,7);
125 #define log_internal(level, ...) \
126 log_internal_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
127
128 int log_internalv_realm(
129 int level,
130 int error,
131 const char *file,
132 int line,
133 const char *func,
134 const char *format,
135 va_list ap) _printf_(6,0);
136 #define log_internalv(level, ...) \
137 log_internalv_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
138
139 /* Realm is fixed to LOG_REALM_SYSTEMD for those */
140 int log_object_internal(
141 int level,
142 int error,
143 const char *file,
144 int line,
145 const char *func,
146 const char *object_field,
147 const char *object,
148 const char *extra_field,
149 const char *extra,
150 const char *format, ...) _printf_(10,11);
151
152 int log_object_internalv(
153 int level,
154 int error,
155 const char *file,
156 int line,
157 const char *func,
158 const char *object_field,
159 const char *object,
160 const char *extra_field,
161 const char *extra,
162 const char *format,
163 va_list ap) _printf_(10,0);
164
165 int log_struct_internal(
166 int level,
167 int error,
168 const char *file,
169 int line,
170 const char *func,
171 const char *format, ...) _printf_(6,0) _sentinel_;
172
173 int log_oom_internal(
174 LogRealm realm,
175 const char *file,
176 int line,
177 const char *func);
178
179 int log_format_iovec(
180 struct iovec *iovec,
181 size_t iovec_len,
182 size_t *n,
183 bool newline_separator,
184 int error,
185 const char *format,
186 va_list ap) _printf_(6, 0);
187
188 int log_struct_iovec_internal(
189 int level,
190 int error,
191 const char *file,
192 int line,
193 const char *func,
194 const struct iovec *input_iovec,
195 size_t n_input_iovec);
196
197 /* This modifies the buffer passed! */
198 int log_dump_internal(
199 int level,
200 int error,
201 const char *file,
202 int line,
203 const char *func,
204 char *buffer);
205
206 /* Logging for various assertions */
207 noreturn void log_assert_failed_realm(
208 LogRealm realm,
209 const char *text,
210 const char *file,
211 int line,
212 const char *func);
213 #define log_assert_failed(text, ...) \
214 log_assert_failed_realm(LOG_REALM, (text), __VA_ARGS__)
215
216 noreturn void log_assert_failed_unreachable_realm(
217 LogRealm realm,
218 const char *text,
219 const char *file,
220 int line,
221 const char *func);
222 #define log_assert_failed_unreachable(text, ...) \
223 log_assert_failed_unreachable_realm(LOG_REALM, (text), __VA_ARGS__)
224
225 void log_assert_failed_return_realm(
226 LogRealm realm,
227 const char *text,
228 const char *file,
229 int line,
230 const char *func);
231 #define log_assert_failed_return(text, ...) \
232 log_assert_failed_return_realm(LOG_REALM, (text), __VA_ARGS__)
233
234 #define log_dispatch(level, error, buffer) \
235 log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer)
236
237 /* Logging with level */
238 #define log_full_errno_realm(realm, level, error, ...) \
239 ({ \
240 int _level = (level), _e = (error), _realm = (realm); \
241 (log_get_max_level_realm(_realm) >= LOG_PRI(_level)) \
242 ? log_internal_realm(LOG_REALM_PLUS_LEVEL(_realm, _level), _e, \
243 __FILE__, __LINE__, __func__, __VA_ARGS__) \
244 : -abs(_e); \
245 })
246
247 #define log_full_errno(level, error, ...) \
248 log_full_errno_realm(LOG_REALM, (level), (error), __VA_ARGS__)
249
250 #define log_full(level, ...) log_full_errno((level), 0, __VA_ARGS__)
251
252 int log_emergency_level(void);
253
254 /* Normal logging */
255 #define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__)
256 #define log_info(...) log_full(LOG_INFO, __VA_ARGS__)
257 #define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__)
258 #define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__)
259 #define log_error(...) log_full(LOG_ERR, __VA_ARGS__)
260 #define log_emergency(...) log_full(log_emergency_level(), __VA_ARGS__)
261
262 /* Logging triggered by an errno-like error */
263 #define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__)
264 #define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__)
265 #define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__)
266 #define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__)
267 #define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__)
268 #define log_emergency_errno(error, ...) log_full_errno(log_emergency_level(), error, __VA_ARGS__)
269
270 #ifdef LOG_TRACE
271 # define log_trace(...) log_debug(__VA_ARGS__)
272 #else
273 # define log_trace(...) do {} while (0)
274 #endif
275
276 /* Structured logging */
277 #define log_struct_errno(level, error, ...) \
278 log_struct_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
279 error, __FILE__, __LINE__, __func__, __VA_ARGS__)
280 #define log_struct(level, ...) log_struct_errno(level, 0, __VA_ARGS__)
281
282 #define log_struct_iovec_errno(level, error, iovec, n_iovec) \
283 log_struct_iovec_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
284 error, __FILE__, __LINE__, __func__, iovec, n_iovec)
285 #define log_struct_iovec(level, iovec, n_iovec) log_struct_iovec_errno(level, 0, iovec, n_iovec)
286
287 /* This modifies the buffer passed! */
288 #define log_dump(level, buffer) \
289 log_dump_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
290 0, __FILE__, __LINE__, __func__, buffer)
291
292 #define log_oom() log_oom_internal(LOG_REALM, __FILE__, __LINE__, __func__)
293
294 bool log_on_console(void) _pure_;
295
296 const char *log_target_to_string(LogTarget target) _const_;
297 LogTarget log_target_from_string(const char *s) _pure_;
298
299 /* Helper to prepare various field for structured logging */
300 #define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__
301
302 void log_received_signal(int level, const struct signalfd_siginfo *si);
303
304 /* If turned on, any requests for a log target involving "syslog" will be implicitly upgraded to the equivalent journal target */
305 void log_set_upgrade_syslog_to_journal(bool b);
306
307 /* If turned on, and log_open() is called, we'll not use STDERR_FILENO for logging ever, but rather open /dev/console */
308 void log_set_always_reopen_console(bool b);
309
310 /* If turned on, we'll open the log stream implicitly if needed on each individual log call. This is normally not
311 * desired as we want to reuse our logging streams. It is useful however */
312 void log_set_open_when_needed(bool b);
313
314 /* If turned on, then we'll never use IPC-based logging, i.e. never log to syslog or the journal. We'll only log to
315 * stderr, the console or kmsg */
316 void log_set_prohibit_ipc(bool b);
317
318 int log_syntax_internal(
319 const char *unit,
320 int level,
321 const char *config_file,
322 unsigned config_line,
323 int error,
324 const char *file,
325 int line,
326 const char *func,
327 const char *format, ...) _printf_(9, 10);
328
329 int log_syntax_invalid_utf8_internal(
330 const char *unit,
331 int level,
332 const char *config_file,
333 unsigned config_line,
334 const char *file,
335 int line,
336 const char *func,
337 const char *rvalue);
338
339 #define log_syntax(unit, level, config_file, config_line, error, ...) \
340 ({ \
341 int _level = (level), _e = (error); \
342 (log_get_max_level() >= LOG_PRI(_level)) \
343 ? log_syntax_internal(unit, _level, config_file, config_line, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
344 : -abs(_e); \
345 })
346
347 #define log_syntax_invalid_utf8(unit, level, config_file, config_line, rvalue) \
348 ({ \
349 int _level = (level); \
350 (log_get_max_level() >= LOG_PRI(_level)) \
351 ? log_syntax_invalid_utf8_internal(unit, _level, config_file, config_line, __FILE__, __LINE__, __func__, rvalue) \
352 : -EINVAL; \
353 })
354
355 #define DEBUG_LOGGING _unlikely_(log_get_max_level() >= LOG_DEBUG)