1/*** 2 This file is part of eudev, forked from systemd. 3 4 Copyright 2010 Lennart Poettering 5 6 systemd is free software; you can redistribute it and/or modify it 7 under the terms of the GNU Lesser General Public License as published by 8 the Free Software Foundation; either version 2.1 of the License, or 9 (at your option) any later version. 10 11 systemd is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public License 17 along with systemd; If not, see <http://www.gnu.org/licenses/>. 18***/ 19 20#pragma once 21 22#include <stdbool.h> 23#include <stdarg.h> 24#include <syslog.h> 25#include <errno.h> 26 27#include "macro.h" 28 29typedef enum LogTarget{ 30 LOG_TARGET_CONSOLE, 31 LOG_TARGET_CONSOLE_PREFIXED, 32 LOG_TARGET_KMSG, 33 LOG_TARGET_JOURNAL, 34 LOG_TARGET_JOURNAL_OR_KMSG, 35 LOG_TARGET_SYSLOG, 36 LOG_TARGET_SYSLOG_OR_KMSG, 37 LOG_TARGET_AUTO, /* console if stderr is tty, JOURNAL_OR_KMSG otherwise */ 38 LOG_TARGET_SAFE, /* console if stderr is tty, KMSG otherwise */ 39 LOG_TARGET_NULL, 40 _LOG_TARGET_MAX, 41 _LOG_TARGET_INVALID = -1 42} LogTarget; 43 44void log_set_target(LogTarget target); 45void log_set_max_level(int level); 46int log_get_max_level(void) _pure_; 47 48int log_open(void); 49void log_close(void); 50 51void log_close_syslog(void); 52void log_close_journal(void); 53void log_close_kmsg(void); 54void log_close_console(void); 55 56int log_internal( 57 int level, 58 int error, 59 const char *file, 60 int line, 61 const char *func, 62 const char *format, ...) _printf_(6,7); 63 64int log_internalv( 65 int level, 66 int error, 67 const char *file, 68 int line, 69 const char *func, 70 const char *format, 71 va_list ap) _printf_(6,0); 72 73int log_oom_internal( 74 const char *file, 75 int line, 76 const char *func); 77 78/* Logging for various assertions */ 79noreturn void log_assert_failed( 80 const char *text, 81 const char *file, 82 int line, 83 const char *func); 84 85noreturn void log_assert_failed_unreachable( 86 const char *text, 87 const char *file, 88 int line, 89 const char *func); 90 91 92/* Logging with level */ 93#define log_full_errno(level, error, ...) \ 94 ({ \ 95 int _l = (level), _e = (error); \ 96 (log_get_max_level() >= LOG_PRI(_l)) \ 97 ? log_internal(_l, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \ 98 : -abs(_e); \ 99 }) 100 101#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__) 102 103/* Normal logging */ 104#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__) 105#define log_info(...) log_full(LOG_INFO, __VA_ARGS__) 106#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__) 107#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__) 108#define log_error(...) log_full(LOG_ERR, __VA_ARGS__) 109#define log_emergency(...) log_full(getpid() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__) 110 111/* Logging triggered by an errno-like error */ 112#define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__) 113#define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__) 114#define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__) 115#define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__) 116#define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__) 117#define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__) 118 119#ifdef LOG_TRACE 120# define log_trace(...) log_debug(__VA_ARGS__) 121#else 122# define log_trace(...) do {} while(0) 123#endif 124 125/* This modifies the buffer passed! */ 126 127#define log_oom() log_oom_internal(__FILE__, __LINE__, __func__) 128 129const char *log_target_to_string(LogTarget target) _const_; 130LogTarget log_target_from_string(const char *s) _pure_; 131