summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-05 11:59:46 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-06 13:52:48 -0500
commitfdf9f9bbe4dc3281bc8799e2a1f8709776c8cad8 (patch)
tree992b2aafc78dcb2954a11f47a7c55a72419f3edb
parentd0aa9ce51915f6f7448adfeb4be0f46cc1356124 (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.h7
-rw-r--r--src/shared/log.c85
-rw-r--r--src/shared/log.h19
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,