]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/log.h
Add SPDX license identifiers to source files under the LGPL
[thirdparty/systemd.git] / src / basic / log.h
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
c2f1db8f 2#pragma once
5899f3b7 3
a7334b09
LP
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
5430f7f2
LP
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
a7334b09
LP
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
5430f7f2 17 Lesser General Public License for more details.
a7334b09 18
5430f7f2 19 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21***/
22
07630cea 23#include <errno.h>
17a94911 24#include <stdarg.h>
07630cea 25#include <stdbool.h>
6410074b 26#include <stdlib.h>
4daf54a8 27#include <sys/signalfd.h>
8a03c9ef 28#include <sys/socket.h>
07630cea 29#include <syslog.h>
5899f3b7 30
20ad4cfd 31#include "sd-id128.h"
07630cea 32
158350e8 33#include "macro.h"
df0ff127 34#include "process-util.h"
5899f3b7 35
ff524019
ZJS
36typedef enum LogRealm {
37 LOG_REALM_SYSTEMD,
38 LOG_REALM_UDEV,
39 _LOG_REALM_MAX,
40} LogRealm;
41
42#ifndef LOG_REALM
43# define LOG_REALM LOG_REALM_SYSTEMD
44#endif
45
16801e90
LP
46typedef enum LogTarget{
47 LOG_TARGET_CONSOLE,
aca83a53 48 LOG_TARGET_CONSOLE_PREFIXED,
16801e90 49 LOG_TARGET_KMSG,
5ba081b0
LP
50 LOG_TARGET_JOURNAL,
51 LOG_TARGET_JOURNAL_OR_KMSG,
843d2643
LP
52 LOG_TARGET_SYSLOG,
53 LOG_TARGET_SYSLOG_OR_KMSG,
5ba081b0 54 LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
a6903061 55 LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */
9fae33d2 56 LOG_TARGET_NULL,
16801e90
LP
57 _LOG_TARGET_MAX,
58 _LOG_TARGET_INVALID = -1
ff524019
ZJS
59} LogTarget;
60
61#define LOG_REALM_PLUS_LEVEL(realm, level) \
62 ((realm) << 10 | (level))
63#define LOG_REALM_REMOVE_LEVEL(realm_level) \
64 ((realm_level >> 10))
16801e90
LP
65
66void log_set_target(LogTarget target);
ff524019
ZJS
67void log_set_max_level_realm(LogRealm realm, int level);
68#define log_set_max_level(level) \
69 log_set_max_level_realm(LOG_REALM, (level))
70
3eff4208 71void log_set_facility(int facility);
16801e90 72
34f0e866 73int log_set_target_from_string(const char *e);
ff524019
ZJS
74int log_set_max_level_from_string_realm(LogRealm realm, const char *e);
75#define log_set_max_level_from_string(e) \
76 log_set_max_level_from_string_realm(LOG_REALM, (e))
34f0e866 77
bbe63281 78void log_show_color(bool b);
b1e90ec5 79bool log_get_show_color(void) _pure_;
bbe63281 80void log_show_location(bool b);
b1e90ec5 81bool log_get_show_location(void) _pure_;
bbe63281
LP
82
83int log_show_color_from_string(const char *e);
84int log_show_location_from_string(const char *e);
85
44a6b1b6 86LogTarget log_get_target(void) _pure_;
ff524019
ZJS
87int log_get_max_level_realm(LogRealm realm) _pure_;
88#define log_get_max_level() \
89 log_get_max_level_realm(LOG_REALM)
1adf1049 90
e3e42fc2
ZJS
91/* Functions below that open and close logs or configure logging based on the
92 * environment should not be called from library code — this is always a job
93 * for the application itself.
94 */
95
843d2643 96int log_open(void);
871e5809 97void log_close(void);
4d8a7798 98void log_forget_fds(void);
843d2643 99
16801e90 100void log_close_syslog(void);
5ba081b0 101void log_close_journal(void);
843d2643
LP
102void log_close_kmsg(void);
103void log_close_console(void);
16801e90 104
ff524019
ZJS
105void log_parse_environment_realm(LogRealm realm);
106#define log_parse_environment() \
107 log_parse_environment_realm(LOG_REALM)
34f0e866 108
93484b47
ZJS
109int log_dispatch_internal(
110 int level,
111 int error,
112 const char *file,
113 int line,
114 const char *func,
115 const char *object_field,
116 const char *object,
117 const char *extra,
118 const char *extra_field,
119 char *buffer);
120
ff524019 121int log_internal_realm(
877d54e9 122 int level,
086891e5 123 int error,
79008bdd 124 const char *file,
877d54e9
LP
125 int line,
126 const char *func,
086891e5 127 const char *format, ...) _printf_(6,7);
ff524019
ZJS
128#define log_internal(level, ...) \
129 log_internal_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
5899f3b7 130
ff524019 131int log_internalv_realm(
877d54e9 132 int level,
086891e5 133 int error,
79008bdd 134 const char *file,
877d54e9
LP
135 int line,
136 const char *func,
137 const char *format,
086891e5 138 va_list ap) _printf_(6,0);
ff524019
ZJS
139#define log_internalv(level, ...) \
140 log_internalv_realm(LOG_REALM_PLUS_LEVEL(LOG_REALM, (level)), __VA_ARGS__)
877d54e9 141
ff524019 142/* Realm is fixed to LOG_REALM_SYSTEMD for those */
79008bdd 143int log_object_internal(
fdf9f9bb 144 int level,
086891e5 145 int error,
79008bdd 146 const char *file,
fdf9f9bb
ZJS
147 int line,
148 const char *func,
79008bdd 149 const char *object_field,
fdf9f9bb 150 const char *object,
4b58153d
LP
151 const char *extra_field,
152 const char *extra,
153 const char *format, ...) _printf_(10,11);
fdf9f9bb 154
79008bdd 155int log_object_internalv(
fdf9f9bb 156 int level,
086891e5 157 int error,
4b58153d 158 const char *file,
fdf9f9bb
ZJS
159 int line,
160 const char *func,
79008bdd 161 const char *object_field,
fdf9f9bb 162 const char *object,
4b58153d
LP
163 const char *extra_field,
164 const char *extra,
fdf9f9bb 165 const char *format,
032b7541 166 va_list ap) _printf_(10,0);
fdf9f9bb 167
877d54e9
LP
168int log_struct_internal(
169 int level,
086891e5 170 int error,
877d54e9
LP
171 const char *file,
172 int line,
173 const char *func,
086891e5 174 const char *format, ...) _printf_(6,0) _sentinel_;
877d54e9
LP
175
176int log_oom_internal(
ff524019 177 LogRealm realm,
877d54e9
LP
178 const char *file,
179 int line,
180 const char *func);
185986c6 181
8a03c9ef
ZJS
182int log_format_iovec(
183 struct iovec *iovec,
d3070fbd
LP
184 size_t iovec_len,
185 size_t *n,
8a03c9ef
ZJS
186 bool newline_separator,
187 int error,
188 const char *format,
ba360bb0 189 va_list ap) _printf_(6, 0);
8a03c9ef 190
915b1d01
LP
191int log_struct_iovec_internal(
192 int level,
193 int error,
194 const char *file,
195 int line,
196 const char *func,
197 const struct iovec input_iovec[],
198 size_t n_input_iovec);
199
2149e37c
LP
200/* This modifies the buffer passed! */
201int log_dump_internal(
877d54e9 202 int level,
086891e5 203 int error,
79008bdd 204 const char *file,
877d54e9
LP
205 int line,
206 const char *func,
207 char *buffer);
208
086891e5 209/* Logging for various assertions */
ff524019
ZJS
210noreturn void log_assert_failed_realm(
211 LogRealm realm,
877d54e9
LP
212 const char *text,
213 const char *file,
214 int line,
215 const char *func);
ff524019
ZJS
216#define log_assert_failed(text, ...) \
217 log_assert_failed_realm(LOG_REALM, (text), __VA_ARGS__)
877d54e9 218
ff524019
ZJS
219noreturn void log_assert_failed_unreachable_realm(
220 LogRealm realm,
877d54e9
LP
221 const char *text,
222 const char *file,
223 int line,
224 const char *func);
ff524019
ZJS
225#define log_assert_failed_unreachable(text, ...) \
226 log_assert_failed_unreachable_realm(LOG_REALM, (text), __VA_ARGS__)
80514f9c 227
ff524019
ZJS
228void log_assert_failed_return_realm(
229 LogRealm realm,
80514f9c
LP
230 const char *text,
231 const char *file,
232 int line,
233 const char *func);
ff524019
ZJS
234#define log_assert_failed_return(text, ...) \
235 log_assert_failed_return_realm(LOG_REALM, (text), __VA_ARGS__)
2149e37c 236
93484b47
ZJS
237#define log_dispatch(level, error, buffer) \
238 log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer)
239
086891e5 240/* Logging with level */
ff524019 241#define log_full_errno_realm(realm, level, error, ...) \
1cfa9a4c
LP
242 ({ \
243 int _level = (level), _e = (error); \
ff524019
ZJS
244 (log_get_max_level_realm((realm)) >= LOG_PRI(_level)) \
245 ? log_internal_realm(LOG_REALM_PLUS_LEVEL((realm), _level), _e, \
246 __FILE__, __LINE__, __func__, __VA_ARGS__) \
1cfa9a4c 247 : -abs(_e); \
bf371116 248 })
87ff6b1c 249
ff524019
ZJS
250#define log_full_errno(level, error, ...) \
251 log_full_errno_realm(LOG_REALM, (level), (error), __VA_ARGS__)
252
253#define log_full(level, ...) log_full_errno((level), 0, __VA_ARGS__)
086891e5
LP
254
255/* Normal logging */
4104970e
ZJS
256#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__)
257#define log_info(...) log_full(LOG_INFO, __VA_ARGS__)
258#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__)
259#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__)
260#define log_error(...) log_full(LOG_ERR, __VA_ARGS__)
df0ff127 261#define log_emergency(...) log_full(getpid_cached() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__)
5899f3b7 262
086891e5
LP
263/* Logging triggered by an errno-like error */
264#define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__)
265#define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__)
266#define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__)
267#define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__)
268#define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__)
df0ff127 269#define log_emergency_errno(error, ...) log_full_errno(getpid_cached() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__)
086891e5 270
cb41ff29
ZJS
271#ifdef LOG_TRACE
272# define log_trace(...) log_debug(__VA_ARGS__)
273#else
9ed794a3 274# define log_trace(...) do {} while (0)
cb41ff29
ZJS
275#endif
276
086891e5 277/* Structured logging */
ff524019
ZJS
278#define log_struct_errno(level, error, ...) \
279 log_struct_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
280 error, __FILE__, __LINE__, __func__, __VA_ARGS__)
281#define log_struct(level, ...) log_struct_errno(level, 0, __VA_ARGS__)
0d0f0c50 282
915b1d01
LP
283#define log_struct_iovec_errno(level, error, iovec, n_iovec) \
284 log_struct_iovec_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
285 error, __FILE__, __LINE__, __func__, iovec, n_iovec)
286#define log_struct_iovec(level, iovec, n_iovec) log_struct_iovec_errno(level, 0, iovec, n_iovec)
287
2149e37c 288/* This modifies the buffer passed! */
ff524019
ZJS
289#define log_dump(level, buffer) \
290 log_dump_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
291 0, __FILE__, __LINE__, __func__, buffer)
086891e5 292
ff524019 293#define log_oom() log_oom_internal(LOG_REALM, __FILE__, __LINE__, __func__)
2149e37c 294
44a6b1b6 295bool log_on_console(void) _pure_;
81270860 296
44a6b1b6
ZJS
297const char *log_target_to_string(LogTarget target) _const_;
298LogTarget log_target_from_string(const char *s) _pure_;
706911fb 299
2b044526 300/* Helper to prepare various field for structured logging */
e2cc6eca 301#define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__
4daf54a8
ZJS
302
303void log_received_signal(int level, const struct signalfd_siginfo *si);
c1dc6153
LP
304
305void log_set_upgrade_syslog_to_journal(bool b);
48a601fe 306void log_set_always_reopen_console(bool b);
16e4fd87 307void log_set_open_when_needed(bool b);
158350e8
LP
308
309int log_syntax_internal(
310 const char *unit,
311 int level,
312 const char *config_file,
313 unsigned config_line,
314 int error,
315 const char *file,
316 int line,
317 const char *func,
318 const char *format, ...) _printf_(9, 10);
319
320#define log_syntax(unit, level, config_file, config_line, error, ...) \
321 ({ \
322 int _level = (level), _e = (error); \
323 (log_get_max_level() >= LOG_PRI(_level)) \
324 ? log_syntax_internal(unit, _level, config_file, config_line, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \
325 : -abs(_e); \
326 })
0e05ee04
LP
327
328#define log_syntax_invalid_utf8(unit, level, config_file, config_line, rvalue) \
329 ({ \
330 int _level = (level); \
331 if (log_get_max_level() >= LOG_PRI(_level)) { \
332 _cleanup_free_ char *_p = NULL; \
333 _p = utf8_escape_invalid(rvalue); \
334 log_syntax_internal(unit, _level, config_file, config_line, 0, __FILE__, __LINE__, __func__, \
335 "String is not UTF-8 clean, ignoring assignment: %s", strna(_p)); \
336 } \
0e05ee04 337 })