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