X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flog.c;h=a2a648a93cc8939f55ea93ed53c939b75cd067c6;hb=8e486ef03b992d4c0d373195f5e8d1c3a200bc30;hp=2dd3e978ff1f2e1a0611ef0f7d8935f70cb719b5;hpb=c31e14954b158351b11f886332229a61fff2e5d1;p=elogind.git diff --git a/src/log.c b/src/log.c index 2dd3e978f..a2a648a93 100644 --- a/src/log.c +++ b/src/log.c @@ -96,7 +96,7 @@ static int log_open_kmsg(void) { return 0; if ((kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) { - log_info("Failed to open /dev/kmsg for logging: %s", strerror(errno)); + log_error("Failed to open /dev/kmsg for logging: %s", strerror(errno)); return -errno; } @@ -177,7 +177,7 @@ static int log_open_syslog(void) { fail: log_close_syslog(); - log_info("Failed to open syslog for logging: %s", strerror(-r)); + log_debug("Failed to open syslog for logging: %s", strerror(-r)); return r; } @@ -196,22 +196,31 @@ int log_open(void) { return 0; } - if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || - log_target == LOG_TARGET_SYSLOG) - if ((r = log_open_syslog()) >= 0) { - log_close_console(); - return r; - } - - if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || - log_target == LOG_TARGET_KMSG) - if ((r = log_open_kmsg()) >= 0) { - log_close_syslog(); - log_close_console(); - return r; - } + if (log_target != LOG_TARGET_AUTO || + getpid() == 1 || + isatty(STDERR_FILENO) <= 0) { + + if (log_target == LOG_TARGET_AUTO || + log_target == LOG_TARGET_SYSLOG_OR_KMSG || + log_target == LOG_TARGET_SYSLOG) + if ((r = log_open_syslog()) >= 0) { + log_close_console(); + return r; + } + if (log_target == LOG_TARGET_AUTO || + log_target == LOG_TARGET_SYSLOG_OR_KMSG || + log_target == LOG_TARGET_KMSG) + if ((r = log_open_kmsg()) >= 0) { + log_close_syslog(); + log_close_console(); + return r; + } + } log_close_syslog(); + + /* Get the real /dev/console if we are PID=1, hence reopen */ + log_close_console(); return log_open_console(); } @@ -300,7 +309,7 @@ static int write_to_syslog( IOVEC_SET_STRING(iovec[3], header_pid); IOVEC_SET_STRING(iovec[4], buffer); - /* When using syslog via SOCK_STREAM seperate the messages by NUL chars */ + /* When using syslog via SOCK_STREAM separate the messages by NUL chars */ if (syslog_is_stream) iovec[4].iov_len++; @@ -380,7 +389,8 @@ static int log_dispatch( if ((e = strpbrk(buffer, NEWLINE))) *(e++) = 0; - if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || + if (log_target == LOG_TARGET_AUTO || + log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) { if ((k = write_to_syslog(level, file, line, func, buffer)) < 0) { @@ -391,7 +401,8 @@ static int log_dispatch( } if (k <= 0 && - (log_target == LOG_TARGET_SYSLOG_OR_KMSG || + (log_target == LOG_TARGET_AUTO || + log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_KMSG)) { if ((k = write_to_kmsg(level, file, line, func, buffer)) < 0) { @@ -519,10 +530,9 @@ void log_parse_environment(void) { if (log_show_color_from_string(e) < 0) log_warning("Failed to parse bool %s. Ignoring.", e); - if ((e = getenv("SYSTEMD_LOG_LOCATION"))) { + if ((e = getenv("SYSTEMD_LOG_LOCATION"))) if (log_show_location_from_string(e) < 0) log_warning("Failed to parse bool %s. Ignoring.", e); - } } LogTarget log_get_target(void) { @@ -566,7 +576,8 @@ static const char *const log_target_table[] = { [LOG_TARGET_SYSLOG] = "syslog", [LOG_TARGET_KMSG] = "kmsg", [LOG_TARGET_SYSLOG_OR_KMSG] = "syslog-or-kmsg", - [LOG_TARGET_NULL] = "null" + [LOG_TARGET_NULL] = "null", + [LOG_TARGET_AUTO] = "auto" }; DEFINE_STRING_TABLE_LOOKUP(log_target, LogTarget);