[pulseaudio-discuss] [PATCH v2 3/6] log: Print systemd journal API failure cause
Ahmed S. Darwish
darwish.07 at gmail.com
Mon Mar 14 06:17:05 UTC 2016
Also in case of falling back to stderr, do not forget printing
the original log message.
Signed-off-by: Ahmed S. Darwish <darwish.07 at gmail.com>
---
Notes:
v2 changelog:
- More correct log message
- Print original failed log message after "Error writing
logs to journal..", not before
- In case of stderr transport, use pa_strempty() while
printing the backtrace
Moreover:
- There's a bug in log.c: in case of journal failure the
logging backend is not _permantently_ reset to syslog
or stderr. Rather, the redirection happens only once.
That's the topic of another patch
- Here in my machine there's a bug either in PA or systemd
itself where the sd journal log message "Detected that
we are run from the build tree, fixing search path."
__always__ fails. This only happens for that single
message (!) That will also be the topic of another patch.
src/pulsecore/log.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 0c561e8..f6d8b71 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -363,7 +363,7 @@ static void log_syslog(pa_log_level_t level, char *t, char *timestamp, char *loc
if ((local_t = pa_utf8_to_locale(t)))
t = local_t;
- syslog(level_to_syslog[level], "%s%s%s%s", timestamp, location, t, pa_strempty(bt));
+ syslog(level_to_syslog[level], "%s%s%s%s", timestamp, pa_strempty(location), t, pa_strempty(bt));
pa_xfree(local_t);
}
#endif
@@ -377,7 +377,7 @@ void pa_log_levelv_meta(
va_list ap) {
char *t, *n;
- int saved_errno = errno;
+ int saved_errno = errno, ret;
char *bt = NULL;
pa_log_target_type_t _target;
pa_log_level_t _maximum_level;
@@ -386,7 +386,7 @@ void pa_log_levelv_meta(
/* We don't use dynamic memory allocation here to minimize the hit
* in RT threads */
- char text[16*1024], location[128], timestamp[32];
+ char text[16*1024], location[128], timestamp[32], logging_error[120];
pa_assert(level < PA_LOG_LEVEL_MAX);
pa_assert(format);
@@ -507,24 +507,29 @@ void pa_log_levelv_meta(
#ifdef HAVE_SYSTEMD_JOURNAL
case PA_LOG_JOURNAL:
- if (sd_journal_send("MESSAGE=%s", t,
+ if ((ret = sd_journal_send("MESSAGE=%s", t,
"PRIORITY=%i", level_to_journal[level],
"CODE_FILE=%s", file,
"CODE_FUNC=%s", func,
"CODE_LINE=%d", line,
"PULSE_BACKTRACE=%s", pa_strempty(bt),
- NULL) < 0) {
+ NULL)) < 0) {
+ pa_log_target new_target = { .file = NULL, };
+ pa_snprintf(logging_error, sizeof(logging_error), "Error writing logs to journal. Reason: %s",
+ pa_cstrerror(ret));
#ifdef HAVE_SYSLOG_H
- pa_log_target new_target = { .type = PA_LOG_SYSLOG, .file = NULL };
+ new_target.type = PA_LOG_SYSLOG;
- syslog(level_to_syslog[PA_LOG_ERROR], "%s%s%s", timestamp, __FILE__,
- "Error writing logs to the journal. Redirect log messages to syslog.");
+ log_syslog(PA_LOG_ERROR, logging_error, timestamp, NULL, NULL);
+ log_syslog(PA_LOG_ERROR, (char *)"Redirecting log messages to syslog.", timestamp, NULL, NULL);
log_syslog(level, t, timestamp, location, bt);
#else
- pa_log_target new_target = { .type = PA_LOG_STDERR, .file = NULL };
+ new_target.type = PA_LOG_STDERR;
saved_errno = errno;
- fprintf(stderr, "%s\n", "Error writing logs to the journal. Redirect log messages to console.");
+ fprintf(stderr, "** %s\n", logging_error);
+ fprintf(stderr, "** %s\n", "Redirecting log messages to console.");
+ fprintf(stderr, "%s%s%s%s\n", timestamp, location, t, pa_strempty(bt));
#endif
pa_log_set_target(&new_target);
}
--
Darwish
http://darwish.chasingpointers.com
More information about the pulseaudio-discuss
mailing list