X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Flog.c;h=b96afc4de4ffb93e982da40505f02d526f40e8e4;hp=9c0156026d0a5a7d57b3596fcdae69c2d0dc57cb;hb=52306a952075183d4bdb20d9dc446cf26ef3deac;hpb=5ffa8c818120e35c89becd938d160235c069dd12 diff --git a/src/shared/log.c b/src/shared/log.c index 9c0156026..b96afc4de 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -29,11 +29,16 @@ #include #include +#include "sd-messages.h" #include "log.h" #include "util.h" #include "missing.h" #include "macro.h" #include "socket-util.h" +#include "formats-util.h" +#include "process-util.h" +#include "terminal-util.h" +#include "signal-util.h" #define SNDBUF_SIZE (8*1024*1024) @@ -689,7 +694,8 @@ int log_object_internalv( va_list ap) { PROTECT_ERRNO; - char buffer[LINE_MAX]; + char *buffer, *b; + size_t l; if (error < 0) error = -error; @@ -701,7 +707,21 @@ int log_object_internalv( if (error != 0) errno = error; - vsnprintf(buffer, sizeof(buffer), format, ap); + /* Prepend the object name before the message */ + if (object) { + size_t n; + + n = strlen(object); + l = n + 2 + LINE_MAX; + + buffer = newa(char, l); + b = stpcpy(stpcpy(buffer, object), ": "); + } else { + l = LINE_MAX; + b = buffer = newa(char, l); + } + + vsnprintf(b, l, format, ap); return log_dispatch(level, error, file, line, func, object_field, object, buffer); } @@ -914,7 +934,9 @@ static int parse_proc_cmdline_item(const char *key, const char *value) { * The systemd.log_xyz= settings are parsed by all tools, and * so is "debug". * - * However, "quiet" is only parsed by PID 1! + * However, "quiet" is only parsed by PID 1, and only turns of + * status output to /dev/console, but does not alter the log + * level. */ if (streq(key, "debug") && !value) @@ -947,7 +969,11 @@ static int parse_proc_cmdline_item(const char *key, const char *value) { void log_parse_environment(void) { const char *e; - (void) parse_proc_cmdline(parse_proc_cmdline_item); + if (get_ctty_devnr(0, NULL) < 0) + /* Only try to read the command line in daemons. + We assume that anything that has a controlling + tty is user stuff. */ + (void) parse_proc_cmdline(parse_proc_cmdline_item); e = secure_getenv("SYSTEMD_LOG_TARGET"); if (e && log_set_target_from_string(e) < 0) @@ -1055,3 +1081,58 @@ void log_received_signal(int level, const struct signalfd_siginfo *si) { void log_set_upgrade_syslog_to_journal(bool b) { upgrade_syslog_to_journal = b; } + +int log_syntax_internal( + const char *unit, + int level, + const char *config_file, + unsigned config_line, + int error, + const char *file, + int line, + const char *func, + const char *format, ...) { + + PROTECT_ERRNO; + char buffer[LINE_MAX]; + int r; + va_list ap; + + if (error < 0) + error = -error; + + if (_likely_(LOG_PRI(level) > log_max_level)) + return -error; + + if (log_target == LOG_TARGET_NULL) + return -error; + + if (error != 0) + errno = error; + + va_start(ap, format); + vsnprintf(buffer, sizeof(buffer), format, ap); + va_end(ap); + + if (unit) + r = log_struct_internal( + level, error, + file, line, func, + getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s", unit, + LOG_MESSAGE_ID(SD_MESSAGE_INVALID_CONFIGURATION), + "CONFIG_FILE=%s", config_file, + "CONFIG_LINE=%u", config_line, + LOG_MESSAGE("[%s:%u] %s", config_file, config_line, buffer), + NULL); + else + r = log_struct_internal( + level, error, + file, line, func, + LOG_MESSAGE_ID(SD_MESSAGE_INVALID_CONFIGURATION), + "CONFIG_FILE=%s", config_file, + "CONFIG_LINE=%u", config_line, + LOG_MESSAGE("[%s:%u] %s", config_file, config_line, buffer), + NULL); + + return r; +}