]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/log.h
tree-wide: mark log_struct with _printf_ and fix fallout
[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"
5899f3b7 33
16801e90
LP
34typedef enum LogTarget{
35 LOG_TARGET_CONSOLE,
aca83a53 36 LOG_TARGET_CONSOLE_PREFIXED,
16801e90 37 LOG_TARGET_KMSG,
5ba081b0
LP
38 LOG_TARGET_JOURNAL,
39 LOG_TARGET_JOURNAL_OR_KMSG,
843d2643
LP
40 LOG_TARGET_SYSLOG,
41 LOG_TARGET_SYSLOG_OR_KMSG,
5ba081b0 42 LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */
a6903061 43 LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */
9fae33d2 44 LOG_TARGET_NULL,
16801e90
LP
45 _LOG_TARGET_MAX,
46 _LOG_TARGET_INVALID = -1
47} LogTarget;
48
49void log_set_target(LogTarget target);
50void log_set_max_level(int level);
3eff4208 51void log_set_facility(int facility);
16801e90 52
34f0e866
LP
53int log_set_target_from_string(const char *e);
54int log_set_max_level_from_string(const char *e);
55
bbe63281 56void log_show_color(bool b);
b1e90ec5 57bool log_get_show_color(void) _pure_;
bbe63281 58void log_show_location(bool b);
b1e90ec5 59bool log_get_show_location(void) _pure_;
bbe63281
LP
60
61int log_show_color_from_string(const char *e);
62int log_show_location_from_string(const char *e);
63
44a6b1b6
ZJS
64LogTarget log_get_target(void) _pure_;
65int log_get_max_level(void) _pure_;
1adf1049 66
843d2643 67int log_open(void);
871e5809 68void log_close(void);
4d8a7798 69void log_forget_fds(void);
843d2643 70
16801e90 71void log_close_syslog(void);
5ba081b0 72void log_close_journal(void);
843d2643
LP
73void log_close_kmsg(void);
74void log_close_console(void);
16801e90 75
34f0e866
LP
76void log_parse_environment(void);
77
79008bdd 78int log_internal(
877d54e9 79 int level,
086891e5 80 int error,
79008bdd 81 const char *file,
877d54e9
LP
82 int line,
83 const char *func,
086891e5 84 const char *format, ...) _printf_(6,7);
5899f3b7 85
79008bdd 86int log_internalv(
877d54e9 87 int level,
086891e5 88 int error,
79008bdd 89 const char *file,
877d54e9
LP
90 int line,
91 const char *func,
92 const char *format,
086891e5 93 va_list ap) _printf_(6,0);
877d54e9 94
79008bdd 95int log_object_internal(
fdf9f9bb 96 int level,
086891e5 97 int error,
79008bdd 98 const char *file,
fdf9f9bb
ZJS
99 int line,
100 const char *func,
79008bdd 101 const char *object_field,
fdf9f9bb 102 const char *object,
4b58153d
LP
103 const char *extra_field,
104 const char *extra,
105 const char *format, ...) _printf_(10,11);
fdf9f9bb 106
79008bdd 107int log_object_internalv(
fdf9f9bb 108 int level,
086891e5 109 int error,
4b58153d 110 const char *file,
fdf9f9bb
ZJS
111 int line,
112 const char *func,
79008bdd 113 const char *object_field,
fdf9f9bb 114 const char *object,
4b58153d
LP
115 const char *extra_field,
116 const char *extra,
fdf9f9bb 117 const char *format,
032b7541 118 va_list ap) _printf_(10,0);
fdf9f9bb 119
877d54e9
LP
120int log_struct_internal(
121 int level,
086891e5 122 int error,
877d54e9
LP
123 const char *file,
124 int line,
125 const char *func,
086891e5 126 const char *format, ...) _printf_(6,0) _sentinel_;
877d54e9
LP
127
128int log_oom_internal(
129 const char *file,
130 int line,
131 const char *func);
185986c6 132
8a03c9ef
ZJS
133int 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,
ba360bb0 140 va_list ap) _printf_(6, 0);
8a03c9ef 141
2149e37c
LP
142/* This modifies the buffer passed! */
143int log_dump_internal(
877d54e9 144 int level,
086891e5 145 int error,
79008bdd 146 const char *file,
877d54e9
LP
147 int line,
148 const char *func,
149 char *buffer);
150
086891e5 151/* Logging for various assertions */
919ce0b7 152noreturn void log_assert_failed(
877d54e9
LP
153 const char *text,
154 const char *file,
155 int line,
156 const char *func);
157
919ce0b7 158noreturn void log_assert_failed_unreachable(
877d54e9
LP
159 const char *text,
160 const char *file,
161 int line,
162 const char *func);
80514f9c
LP
163
164void log_assert_failed_return(
165 const char *text,
166 const char *file,
167 int line,
168 const char *func);
2149e37c 169
086891e5 170/* Logging with level */
1cfa9a4c
LP
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); \
bf371116 177 })
87ff6b1c 178
086891e5
LP
179#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__)
180
181/* Normal logging */
4104970e
ZJS
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__)
5899f3b7 188
086891e5
LP
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__)
b4d23205 195#define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__)
086891e5 196
cb41ff29
ZJS
197#ifdef LOG_TRACE
198# define log_trace(...) log_debug(__VA_ARGS__)
199#else
9ed794a3 200# define log_trace(...) do {} while (0)
cb41ff29
ZJS
201#endif
202
086891e5
LP
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__)
0d0f0c50 206
2149e37c 207/* This modifies the buffer passed! */
086891e5
LP
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__)
2149e37c 211
44a6b1b6 212bool log_on_console(void) _pure_;
81270860 213
44a6b1b6
ZJS
214const char *log_target_to_string(LogTarget target) _const_;
215LogTarget log_target_from_string(const char *s) _pure_;
706911fb 216
2b044526 217/* Helper to prepare various field for structured logging */
e2cc6eca 218#define LOG_MESSAGE(fmt, ...) "MESSAGE=" fmt, ##__VA_ARGS__
4daf54a8
ZJS
219
220void log_received_signal(int level, const struct signalfd_siginfo *si);
c1dc6153
LP
221
222void log_set_upgrade_syslog_to_journal(bool b);
48a601fe 223void log_set_always_reopen_console(bool b);
158350e8
LP
224
225int 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 })
0e05ee04
LP
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 } \
0e05ee04 253 })