diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-01-05 11:59:46 -0500 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-01-06 13:52:48 -0500 |
commit | fdf9f9bbe4dc3281bc8799e2a1f8709776c8cad8 (patch) | |
tree | 992b2aafc78dcb2954a11f47a7c55a72419f3edb | |
parent | d0aa9ce51915f6f7448adfeb4be0f46cc1356124 (diff) |
journal: new logging macros to include UNIT=
Adding UNIT= to log lines allows them to be shown
in 'systemctl status' output, etc.
A new set of macros and functions is added. This allows for less
verbose notation than using log_struct() explicitly.
The set of logging functions is expanded to take a pair of arguments
(e.g. "UNIT=" and the RHS) which add an extra line to the structured
log entry. This can be used to add macros which add a different
identifier later on.
-rw-r--r-- | src/core/unit.h | 7 | ||||
-rw-r--r-- | src/shared/log.c | 85 | ||||
-rw-r--r-- | src/shared/log.h | 19 |
3 files changed, 102 insertions, 9 deletions
diff --git a/src/core/unit.h b/src/core/unit.h index 790d3d758e..702bfeece6 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -555,3 +555,10 @@ UnitActiveState unit_active_state_from_string(const char *s); const char *unit_dependency_to_string(UnitDependency i); UnitDependency unit_dependency_from_string(const char *s); + +#define log_full_unit(level, unit, ...) log_meta_object(level, __FILE__, __LINE__, __func__, "UNIT=", unit, __VA_ARGS__) +#define log_debug_unit(unit, ...) log_full_unit(LOG_DEBUG, unit, __VA_ARGS__) +#define log_info_unit(unit, ...) log_full_unit(LOG_INFO, unit, __VA_ARGS__) +#define log_notice_unit(unit, ...) log_full_unit(LOG_NOTICE, unit, __VA_ARGS__) +#define log_warning_unit(unit, ...) log_full_unit(LOG_WARNING, unit, __VA_ARGS__) +#define log_error_unit(unit, ...) log_full_unit(LOG_ERR, unit, __VA_ARGS__) diff --git a/src/shared/log.c b/src/shared/log.c index 63578683ab..8d3458e731 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -308,6 +308,8 @@ static int write_to_console( const char*file, int line, const char *func, + const char *object_name, + const char *object, const char *buffer) { char location[64]; @@ -346,6 +348,8 @@ static int write_to_syslog( const char*file, int line, const char *func, + const char *object_name, + const char *object, const char *buffer) { char header_priority[16], header_time[64], header_pid[16]; @@ -361,7 +365,8 @@ static int write_to_syslog( char_array_0(header_priority); t = (time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC); - if (!(tm = localtime(&t))) + tm = localtime(&t); + if (!tm) return -EINVAL; if (strftime(header_time, sizeof(header_time), "%h %e %T ", tm) <= 0) @@ -407,6 +412,8 @@ static int write_to_kmsg( const char*file, int line, const char *func, + const char *object_name, + const char *object, const char *buffer) { char header_priority[16], header_pid[16]; @@ -439,6 +446,8 @@ static int write_to_journal( const char*file, int line, const char *func, + const char *object_name, + const char *object, const char *buffer) { char header[LINE_MAX]; @@ -454,6 +463,7 @@ static int write_to_journal( "CODE_FILE=%s\n" "CODE_LINE=%i\n" "CODE_FUNCTION=%s\n" + "%s%.*s%s" "SYSLOG_IDENTIFIER=%s\n" "MESSAGE=", LOG_PRI(level), @@ -461,6 +471,9 @@ static int write_to_journal( file, line, func, + object ? object_name : "", + object ? LINE_MAX : 0, object, /* %.0s means no output */ + object ? "\n" : "", program_invocation_short_name); char_array_0(header); @@ -485,6 +498,8 @@ static int log_dispatch( const char*file, int line, const char *func, + const char *object_name, + const char *object, char *buffer) { int r = 0; @@ -512,7 +527,8 @@ static int log_dispatch( log_target == LOG_TARGET_JOURNAL_OR_KMSG || log_target == LOG_TARGET_JOURNAL) { - k = write_to_journal(level, file, line, func, buffer); + k = write_to_journal(level, file, line, func, + object_name, object, buffer); if (k < 0) { if (k != -EAGAIN) log_close_journal(); @@ -524,7 +540,8 @@ static int log_dispatch( if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) { - k = write_to_syslog(level, file, line, func, buffer); + k = write_to_syslog(level, file, line, func, + object_name, object, buffer); if (k < 0) { if (k != -EAGAIN) log_close_syslog(); @@ -540,7 +557,8 @@ static int log_dispatch( log_target == LOG_TARGET_JOURNAL_OR_KMSG || log_target == LOG_TARGET_KMSG)) { - k = write_to_kmsg(level, file, line, func, buffer); + k = write_to_kmsg(level, file, line, func, + object_name, object, buffer); if (k < 0) { log_close_kmsg(); log_open_console(); @@ -549,7 +567,8 @@ static int log_dispatch( } if (k <= 0) { - k = write_to_console(level, file, line, func, buffer); + k = write_to_console(level, file, line, func, + object_name, object, buffer); if (k < 0) return k; } @@ -575,7 +594,7 @@ int log_dump_internal( return 0; saved_errno = errno; - r = log_dispatch(level, file, line, func, buffer); + r = log_dispatch(level, file, line, func, NULL, NULL, buffer); errno = saved_errno; return r; @@ -599,7 +618,7 @@ int log_metav( vsnprintf(buffer, sizeof(buffer), format, ap); char_array_0(buffer); - r = log_dispatch(level, file, line, func, buffer); + r = log_dispatch(level, file, line, func, NULL, NULL, buffer); errno = saved_errno; return r; @@ -622,6 +641,53 @@ int log_meta( return r; } +int log_metav_object( + int level, + const char*file, + int line, + const char *func, + const char *object_name, + const char *object, + const char *format, + va_list ap) { + + char buffer[LINE_MAX]; + int saved_errno, r; + + if (_likely_(LOG_PRI(level) > log_max_level)) + return 0; + + saved_errno = errno; + vsnprintf(buffer, sizeof(buffer), format, ap); + char_array_0(buffer); + + r = log_dispatch(level, file, line, func, + object_name, object, buffer); + errno = saved_errno; + + return r; +} + +int log_meta_object( + int level, + const char*file, + int line, + const char *func, + const char *object_name, + const char *object, + const char *format, ...) { + + int r; + va_list ap; + + va_start(ap, format); + r = log_metav_object(level, file, line, func, + object_name, object, format, ap); + va_end(ap); + + return r; +} + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wformat-nonliteral" _noreturn_ static void log_assert(const char *text, const char *file, int line, const char *func, const char *format) { @@ -632,7 +698,7 @@ _noreturn_ static void log_assert(const char *text, const char *file, int line, char_array_0(buffer); log_abort_msg = buffer; - log_dispatch(LOG_CRIT, file, line, func, buffer); + log_dispatch(LOG_CRIT, file, line, func, NULL, NULL, buffer); abort(); } #pragma GCC diagnostic pop @@ -774,7 +840,8 @@ int log_struct_internal( va_end(ap); if (found) - r = log_dispatch(level, file, line, func, buf + 8); + r = log_dispatch(level, file, line, func, + NULL, NULL, buf + 8); else r = -EINVAL; } diff --git a/src/shared/log.h b/src/shared/log.h index 5c946faf51..9aafcb4100 100644 --- a/src/shared/log.h +++ b/src/shared/log.h @@ -85,6 +85,25 @@ int log_metav( const char *format, va_list ap); +int log_meta_object( + int level, + const char*file, + int line, + const char *func, + const char *object_name, + const char *object, + const char *format, ...) _printf_attr_(7,8); + +int log_metav_object( + int level, + const char*file, + int line, + const char *func, + const char *object_name, + const char *object, + const char *format, + va_list ap); + int log_struct_internal( int level, const char *file, |