chiark / gitweb /
basic/log: expose log_dispatch
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 21 Apr 2017 16:52:54 +0000 (12:52 -0400)
committerSven Eden <yamakuzure@gmx.net>
Tue, 25 Jul 2017 07:46:52 +0000 (09:46 +0200)
This is useful when we want to avoid printf formatting on the message.
It's nicer than using log_struct with "%s" as the format, because printf
is slow and with a large message (like from a backtrace) this would require
extra unnecessary memory.

I'm not exposing all the fields in the wrapper: only level and errno.
Those are the most likely to be useful.

src/basic/log.c
src/basic/log.h

index df1a775f11652969c1439d149ae941e6248071f5..a2285b4f54de2379c9aca97edc9ac503e27f8805 100644 (file)
@@ -58,8 +58,7 @@
 #define SNDBUF_SIZE (8*1024*1024)
 
 static LogTarget log_target = LOG_TARGET_CONSOLE;
-static int log_max_level[] = {LOG_INFO, LOG_INFO};
-assert_cc(ELEMENTSOF(log_max_level) == _LOG_REALM_MAX);
+static int log_max_level = LOG_INFO;
 static int log_facility = LOG_DAEMON;
 
 static int console_fd = STDERR_FILENO;
@@ -328,11 +327,10 @@ void log_forget_fds(void) {
 }
 #endif // 0
 
-void log_set_max_level_realm(LogRealm realm, int level) {
+void log_set_max_level(int level) {
         assert((level & LOG_PRIMASK) == level);
-        assert(realm < ELEMENTSOF(log_max_level));
 
-        log_max_level[realm] = level;
+        log_max_level = level;
 }
 
 void log_set_facility(int facility) {
@@ -654,14 +652,13 @@ int log_dispatch_internal(
 }
 
 int log_dump_internal(
-                int level,
-                int error,
-                const char *file,
-                int line,
-                const char *func,
-                char *buffer) {
+        int level,
+        int error,
+        const char *file,
+        int line,
+        const char *func,
+        char *buffer) {
 
-        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
         PROTECT_ERRNO;
 
         /* This modifies the buffer... */
@@ -669,13 +666,13 @@ int log_dump_internal(
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return -error;
 
         return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-int log_internalv_realm(
+int log_internalv(
                 int level,
                 int error,
                 const char *file,
@@ -684,14 +681,13 @@ int log_internalv_realm(
                 const char *format,
                 va_list ap) {
 
-        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
-        char buffer[LINE_MAX];
         PROTECT_ERRNO;
+        char buffer[LINE_MAX];
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return -error;
 
         /* Make sure that %m maps to the specified error */
@@ -703,7 +699,7 @@ int log_internalv_realm(
         return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-int log_internal_realm(
+int log_internal(
                 int level,
                 int error,
                 const char *file,
@@ -715,7 +711,7 @@ int log_internal_realm(
         int r;
 
         va_start(ap, format);
-        r = log_internalv_realm(level, error, file, line, func, format, ap);
+        r = log_internalv(level, error, file, line, func, format, ap);
         va_end(ap);
 
         return r;
@@ -741,7 +737,7 @@ int log_object_internalv(
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return -error;
 
         /* Make sure that %m maps to the specified error */
@@ -799,9 +795,8 @@ static void log_assert(
                 const char *format) {
 
         static char buffer[LINE_MAX];
-        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
 
-        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return;
 
         DISABLE_WARNING_FORMAT_NONLITERAL;
@@ -813,42 +808,23 @@ static void log_assert(
         log_dispatch_internal(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer);
 }
 
-noreturn void log_assert_failed_realm(
-                LogRealm realm,
-                const char *text,
-                const char *file,
-                int line,
-                const char *func) {
-        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func,
-                   "Assertion '%s' failed at %s:%u, function %s(). Aborting.");
+noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) {
+        log_assert(LOG_CRIT, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Aborting.");
         abort();
 }
 
-noreturn void log_assert_failed_unreachable_realm(
-                LogRealm realm,
-                const char *text,
-                const char *file,
-                int line,
-                const char *func) {
-        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_CRIT), text, file, line, func,
-                   "Code should not be reached '%s' at %s:%u, function %s(). Aborting.");
+noreturn void log_assert_failed_unreachable(const char *text, const char *file, int line, const char *func) {
+        log_assert(LOG_CRIT, text, file, line, func, "Code should not be reached '%s' at %s:%u, function %s(). Aborting.");
         abort();
 }
 
-void log_assert_failed_return_realm(
-                LogRealm realm,
-                const char *text,
-                const char *file,
-                int line,
-                const char *func) {
+void log_assert_failed_return(const char *text, const char *file, int line, const char *func) {
         PROTECT_ERRNO;
-        log_assert(LOG_REALM_PLUS_LEVEL(realm, LOG_DEBUG), text, file, line, func,
-                   "Assertion '%s' failed at %s:%u, function %s(). Ignoring.");
+        log_assert(LOG_DEBUG, text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Ignoring.");
 }
 
-int log_oom_internal(LogRealm realm, const char *file, int line, const char *func) {
-        log_internal_realm(LOG_REALM_PLUS_LEVEL(realm, LOG_ERR),
-                           ENOMEM, file, line, func, "Out of memory.");
+int log_oom_internal(const char *file, int line, const char *func) {
+        log_internal(LOG_ERR, ENOMEM, file, line, func, "Out of memory.");
         return -ENOMEM;
 }
 
@@ -908,14 +884,13 @@ int log_struct_internal(
 
         char buf[LINE_MAX];
         bool found = false;
-        LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
         PROTECT_ERRNO;
         va_list ap;
 
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level[realm]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return -error;
 
         if (log_target == LOG_TARGET_NULL)
@@ -1001,14 +976,14 @@ int log_set_target_from_string(const char *e) {
         return 0;
 }
 
-int log_set_max_level_from_string_realm(LogRealm realm, const char *e) {
+int log_set_max_level_from_string(const char *e) {
         int t;
 
         t = log_level_from_string(e);
         if (t < 0)
                 return -EINVAL;
 
-        log_set_max_level_realm(realm, t);
+        log_set_max_level(t);
         return 0;
 }
 
@@ -1056,7 +1031,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
         return 0;
 }
 
-void log_parse_environment_realm(LogRealm realm) {
+void log_parse_environment(void) {
         const char *e;
 
         if (get_ctty_devnr(0, NULL) < 0)
@@ -1069,7 +1044,7 @@ void log_parse_environment_realm(LogRealm realm) {
                 log_warning("Failed to parse log target '%s'. Ignoring.", e);
 
         e = secure_getenv("SYSTEMD_LOG_LEVEL");
-        if (e && log_set_max_level_from_string_realm(realm, e) < 0)
+        if (e && log_set_max_level_from_string(e) < 0)
                 log_warning("Failed to parse log level '%s'. Ignoring.", e);
 
         e = secure_getenv("SYSTEMD_LOG_COLOR");
@@ -1085,8 +1060,8 @@ LogTarget log_get_target(void) {
         return log_target;
 }
 
-int log_get_max_level_realm(LogRealm realm) {
-        return log_max_level[realm];
+int log_get_max_level(void) {
+        return log_max_level;
 }
 
 void log_show_color(bool b) {
@@ -1194,7 +1169,7 @@ int log_syntax_internal(
         if (error < 0)
                 error = -error;
 
-        if (_likely_(LOG_PRI(level) > log_max_level[LOG_REALM_SYSTEMD]))
+        if (_likely_(LOG_PRI(level) > log_max_level))
                 return -error;
 
         if (log_target == LOG_TARGET_NULL)
@@ -1211,8 +1186,7 @@ int log_syntax_internal(
                 unit_fmt = getpid() == 1 ? "UNIT=%s" : "USER_UNIT=%s";
 
         return log_struct_internal(
-                        LOG_REALM_PLUS_LEVEL(LOG_REALM_SYSTEMD, level),
-                        error,
+                        level, error,
                         file, line, func,
                         "MESSAGE_ID=" SD_MESSAGE_INVALID_CONFIGURATION_STR,
                         "CONFIG_FILE=%s", config_file,
index d4bc3a9342968f925910439dc013657a9cec68b7..8353394ffac950e133fab1e3d72caf97b120c23e 100644 (file)
@@ -77,6 +77,18 @@ void log_close_console(void);
 
 void log_parse_environment(void);
 
+int log_dispatch_internal(
+                int level,
+                int error,
+                const char *file,
+                int line,
+                const char *func,
+                const char *object_field,
+                const char *object,
+                const char *extra,
+                const char *extra_field,
+                char *buffer);
+
 int log_internal(
                 int level,
                 int error,
@@ -169,6 +181,9 @@ void log_assert_failed_return(
                 int line,
                 const char *func);
 
+#define log_dispatch(level, error, buffer)                              \
+        log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer)
+
 /* Logging with level */
 #define log_full_errno(level, error, ...)                               \
         ({                                                              \