Add util_default_format configuration option 74/281474/7
authorMateusz Majewski <m.majewski2@samsung.com>
Mon, 19 Sep 2022 09:42:09 +0000 (11:42 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Wed, 21 Sep 2022 20:27:22 +0000 (22:27 +0200)
Change-Id: I6b3368007ca6546b5e6cf7cc340d27651354317d

13 files changed:
Makefile.am
configs/dlog.conf
include/logprint.h
include/util_parser.h
src/logger/dlogutil_line.c
src/logger/dlogutil_line.h
src/logger/log_buffer.c
src/logger/logger.c
src/logger/logger_internal.h
src/logutil/logutil.c
src/shared/logprint.c
src/shared/util_parser.c
tests/dlog_test.in

index 56e5116..6041915 100644 (file)
@@ -100,8 +100,10 @@ dlogutil_LDADD = \
 dlogutil_SOURCES = \
        src/logutil/logutil.c \
        src/shared/logcommon.c \
+       src/shared/logconfig.c \
        src/shared/logprint.c \
        src/shared/log_file.c \
+       src/shared/parsers.c \
        src/shared/ptrs_list.c \
        src/shared/util_parser.c
 
@@ -507,7 +509,7 @@ src_tests_test_fastlz_neg_SOURCES = external/fastlz/fastlz.c src/tests/test_fast
 src_tests_test_fastlz_neg_CFLAGS = $(check_CFLAGS)
 src_tests_test_fastlz_neg_LDFLAGS = $(AM_LDFLAGS)
 
-src_tests_fuzz_logprint_SOURCES = src/tests/fuzz_logprint.c src/shared/ptrs_list.c src/shared/logprint.c src/shared/logcommon.c src/shared/queued_entry.c src/shared/parsers.c src/shared/translate_syslog.c src/shared/queued_entry_timestamp.c
+src_tests_fuzz_logprint_SOURCES = src/tests/fuzz_logprint.c src/shared/ptrs_list.c src/shared/logconfig.c src/shared/logprint.c src/shared/logcommon.c src/shared/queued_entry.c src/shared/parsers.c src/shared/translate_syslog.c src/shared/queued_entry_timestamp.c
 src_tests_fuzz_logprint_CFLAGS = $(check_CFLAGS)
 src_tests_fuzz_logprint_LDFLAGS = $(AM_LDFLAGS)
 
@@ -657,7 +659,7 @@ src_tests_config_SOURCES = src/tests/config.c src/shared/logconfig.c src/shared/
 src_tests_config_CFLAGS = $(check_CFLAGS)
 src_tests_config_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=openat64,--wrap=openat,--wrap=scandirat,--wrap=scandirat64,--wrap=fdopen,--wrap=fdopen64,--wrap=open,--wrap=open64,--wrap=calloc
 
-src_tests_logprint_SOURCES = src/tests/logprint.c src/shared/ptrs_list.c src/shared/logprint.c src/shared/logcommon.c src/shared/queued_entry.c src/shared/parsers.c src/shared/translate_syslog.c src/shared/queued_entry_timestamp.c
+src_tests_logprint_SOURCES = src/tests/logprint.c src/shared/ptrs_list.c src/shared/logconfig.c src/shared/logprint.c src/shared/logcommon.c src/shared/queued_entry.c src/shared/parsers.c src/shared/translate_syslog.c src/shared/queued_entry_timestamp.c
 src_tests_logprint_CFLAGS = $(check_CFLAGS)
 src_tests_logprint_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=write,--wrap=malloc,--wrap=calloc,--wrap=localtime_r,--wrap=strdup,--wrap=strndup,--wrap=list_add
 
@@ -776,7 +778,7 @@ src_tests_pid_limiter_SOURCES = src/tests/pid_limiter.c \
 src_tests_pid_limiter_CFLAGS = $(check_CFLAGS) -Wl,--wrap=getpid,--wrap=time
 src_tests_pid_limiter_LDFLAGS = $(AM_LDFLAGS)
 
-src_tests_filters_SOURCES = src/tests/filters.c src/shared/ptrs_list.c src/shared/logcommon.c src/shared/logprint.c src/shared/queued_entry_timestamp.c
+src_tests_filters_SOURCES = src/tests/filters.c src/shared/ptrs_list.c src/shared/logcommon.c src/shared/logconfig.c src/shared/logprint.c src/shared/queued_entry_timestamp.c src/shared/parsers.c
 src_tests_filters_CFLAGS = $(check_CFLAGS)
 src_tests_filters_LDFLAGS = $(AM_LDFLAGS)
 
index 3cfd58b..296995a 100644 (file)
@@ -91,6 +91,11 @@ util_sorting_time_window=1000
 # agrees with what the source provides.
 #util_sorting_buffer_size=131072
 
+# Default output format. This applies both to explicit dlogutil calls and
+# persistent logging (i.e. writing to a file defined in daemon config).
+# By default this is brief, but this will work even if the option is not provided explicitly.
+#util_default_format=brief
+
 # Deduplication blocks logs within the certain period of time (interval_millisec) starting from last_millisec.
 
 # Block logs when neighbouring logs have the same content. It is quite simple deduplication,
index bdecd38..3c4b9d3 100644 (file)
@@ -171,6 +171,7 @@ int log_print_log_line(
                struct log_write_buffer *buf);
 
 dlogutil_sorting_order_e get_format_sorting(log_print_format format);
+log_print_format get_default_format_from_config(const struct log_config *conf);
 
 #ifdef __cplusplus
 }
index ee894ff..60b8755 100644 (file)
@@ -59,9 +59,10 @@ struct parse_result {
  * @remarks The output struct might contain parts of argv. Also, argv won't be modified.
  * @param[in] argc Size of the argv array
  * @param[out] argv Array of string arguments
+ * @param[in] log_print_format Format returned in case of none provided
  * @return A result struct
  */
-struct parse_result parse_options(int argc, char **argv);
+struct parse_result parse_options(int argc, char **argv, log_print_format default_format);
 /**
  * @brief Free contents of the #parse_result struct
  * @remarks The struct itself won't be freed (as usually it's passed on the stack).
index a582c15..5e850d4 100644 (file)
@@ -58,13 +58,13 @@ static int make_argc_argv_from_dlogutil_line(const char *cmdl, size_t buf_size,
        return 0;
 }
 
-static int get_dlogutil_params_from_argc_argv(int argc, char **argv, struct dlogutil_line_params *params)
+static int get_dlogutil_params_from_argc_argv(int argc, char **argv, log_print_format default_format, struct dlogutil_line_params *params)
 {
        assert(argc >= 0);
        assert(argv);
        assert(params);
 
-       __attribute__((cleanup(parse_result_cleanup))) struct parse_result pr = parse_options(argc, argv);
+       __attribute__((cleanup(parse_result_cleanup))) struct parse_result pr = parse_options(argc, argv, default_format);
 
        if (pr.status == PARSE_OOM)
                return -ENOMEM;
@@ -124,7 +124,7 @@ static int get_dlogutil_params_from_argc_argv(int argc, char **argv, struct dlog
        return 0;
 }
 
-int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params)
+int get_dlogutil_line_params(const char *cmdl, log_print_format default_format, struct dlogutil_line_params *params)
 {
        assert(params);
        assert(cmdl);
@@ -135,5 +135,5 @@ int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *para
        if (ret < 0)
                return ret;
 
-       return get_dlogutil_params_from_argc_argv(argc, argv, params);
+       return get_dlogutil_params_from_argc_argv(argc, argv, default_format, params);
 }
index 76e84da..8e8bd6e 100644 (file)
@@ -25,5 +25,5 @@ struct dlogutil_line_params {
 };
 
 bool initialize_dlogutil_line_params(struct dlogutil_line_params *params, struct buf_params buf);
-int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params);
+int get_dlogutil_line_params(const char *cmdl, log_print_format default_format, struct dlogutil_line_params *params);
 void free_dlogutil_line_params(struct dlogutil_line_params *params);
index 443567c..cf3dadf 100644 (file)
@@ -226,7 +226,9 @@ static int service_writer_handle_req_util(struct logger *server, struct writer *
                goto cleanup;
        }
 
-       retval = get_dlogutil_line_params(msg->data, &params);
+       /* Note that in this case, the format doesn't matter.
+        * Therefore, we just pass OFF as default. */
+       retval = get_dlogutil_line_params(msg->data, FORMAT_OFF, &params);
        if (retval < 0) {
                // retval = -ENOMEM; // see above
                goto cleanup;
@@ -320,7 +322,9 @@ static int service_writer_handle_req_compressed_memory_util(struct logger *serve
                goto cleanup;
        }
 
-       retval = get_dlogutil_line_params(msg->data, &params);
+       /* Note that in this case, the format doesn't matter.
+        * Therefore, we just pass OFF as default. */
+       retval = get_dlogutil_line_params(msg->data, FORMAT_OFF, &params);
        if (retval < 0) {
                // retval = -ENOMEM; // see above
                goto cleanup;
index 29163c1..ebccc58 100644 (file)
@@ -1166,6 +1166,8 @@ int prepare_config_data(struct logger_config_data *data)
        data->logfile_configs = NULL;
        log_config_foreach(&conf, save_logfile_config, data);
 
+       data->default_format = get_default_format_from_config(&conf);
+
 end:
        log_config_free(&conf);
        return ret;
@@ -1189,6 +1191,11 @@ void free_config_data(struct logger_config_data *data)
        free(data->first_time_file_path);
 }
 
+struct parse_logfile_config_data {
+       struct logger *server;
+       struct logger_config_data *data;
+};
+
 /**
  * @brief Parse logfile line
  * @detail Parses a logfile config line
@@ -1201,14 +1208,15 @@ void parse_logfile_config(void *value, void *userdata)
        assert(value);
        assert(userdata);
 
-       struct logger *server = (struct logger *) userdata;
+       struct logger *server = ((struct parse_logfile_config_data *) userdata)->server;
+       struct logger_config_data *data = ((struct parse_logfile_config_data *) userdata)->data;
        char *configline = (char *) value;
 
        __attribute__((cleanup(free_dlogutil_line_params))) struct dlogutil_line_params params;
        if (!initialize_dlogutil_line_params(&params, server->buf_params))
                return;
 
-       get_dlogutil_line_params(configline, &params);
+       get_dlogutil_line_params(configline, data->default_format, &params);
 
        int r;
        if (g_backend.use_logger_by_default && is_core_buffer(params.buf_id)) {
@@ -1296,7 +1304,10 @@ static int finalize_init(struct logger_config_data *data, struct logger *server)
                return r;
 
        //create files after resetting self privileges
-       list_foreach(data->logfile_configs, server, parse_logfile_config);
+       list_foreach(data->logfile_configs, &(struct parse_logfile_config_data) {
+               .server = server,
+               .data = data,
+       }, parse_logfile_config);
 
        return 0;
 }
index 9af9adb..62aa4c1 100644 (file)
@@ -155,6 +155,7 @@ struct logger_config_data {
        int qos_threshold;
        int qos_threshold_reapply;
        char *first_time_file_path;
+       log_print_format default_format;
 };
 
 void remove_reader_fd_entities(struct logger *server, struct reader_common *reader);
index bbfddbd..929c83c 100644 (file)
@@ -21,6 +21,7 @@
 #include <fcntl.h>
 #include <sys/epoll.h>
 
+#include <logconfig.h>
 #include <log_file.h>
 #include <util_parser.h>
 
@@ -275,7 +276,14 @@ int main(int argc, char **argv)
        logfile_init(&l_file);
        logfile_set_fd(&l_file, fileno(stdout), 0);
 
-       __attribute__((cleanup(parse_result_cleanup))) struct parse_result pr = parse_options(argc, argv);
+       __attribute__((cleanup(log_config_free))) struct log_config conf = {};
+       int r = log_config_read(&conf);
+       if (r < 0) {
+               errno = -r;
+               ERR("Error while reading config: %m");
+       }
+
+       __attribute__((cleanup(parse_result_cleanup))) struct parse_result pr = parse_options(argc, argv, get_default_format_from_config(&conf));
        switch (pr.status) {
                case PARSE_OK:
                        break;
@@ -395,7 +403,6 @@ int main(int argc, char **argv)
 
        int enabled_buffers = pr.enabled_buffers != 0 ? pr.enabled_buffers : default_buffers;
 
-       int r;
        switch (pr.action) {
        case ACTION_PRINT: {
                r = do_print(pr.mode, pr.dump_size, enabled_buffers, pr.sort_by, config, &l_file, pr.compression);
index f49020d..b873411 100644 (file)
@@ -27,6 +27,7 @@
 #include <ctype.h>
 #include <tizen.h>
 
+#include <logconfig.h>
 #include <logprint.h>
 #include <logcommon.h>
 
@@ -344,6 +345,23 @@ log_print_format log_format_from_string(const char *formatString)
        return FORMAT_OFF;
 }
 
+/* This goes here and not into logconfig.c, as otherwise everything that builds with logconfig.c
+ * needs to build needlessly with logprint.c. */
+log_print_format get_default_format_from_config(const struct log_config *conf)
+{
+       assert(conf);
+
+       const char *const name = log_config_get(conf, "util_default_format");
+       if (name == NULL)
+               return FORMAT_BRIEF;
+
+       const log_print_format returned = log_format_from_string(name);
+       if (returned == FORMAT_OFF)
+               return FORMAT_BRIEF;
+
+       return returned;
+}
+
 int priority_from_filter_expression(const char *filterExpression, bool *exact, log_priority *pri)
 {
        assert(exact);
index e87fe1c..b7fed7b 100644 (file)
@@ -13,11 +13,11 @@ void parse_result_cleanup(struct parse_result *pr)
        }
 }
 
-struct parse_result parse_options(int argc, char **argv)
+struct parse_result parse_options(int argc, char **argv, log_print_format default_format)
 {
        bool colors_auto = true;
        bool colors_force = false;
-       log_print_format format = FORMAT_BRIEF;
+       log_print_format format = default_format;
        size_t rotate_size_kbytes = DEFAULT_ROTATE_SIZE_KB;
        size_t max_rotated = DEFAULT_ROTATE_NUM_FILES;
        const char *file_path = NULL;
index 317cc9e..17a764f 100644 (file)
@@ -550,7 +550,8 @@ fi
 LOG_DETAILS="testing if libdlogutil errors out correctly if used improperly"
 test_libdlogutil negative $LIBDLOGUTIL_CORRECT_PID $type && ok || fail
 
-cmd_prefix="dlogutil -t 1 -u 0 -v"
+cmd_prefix_no_v="dlogutil -t 1 -u 0"
+cmd_prefix="$cmd_prefix_no_v -v"
 
 format="process"
 regex_prio="[VDIWEFS]{1}"
@@ -678,6 +679,24 @@ LOG_DETAILS="testing if \"$format\" print format works"
 line=$($cmd_prefix $format)
 [ "$(echo "$line" | sed -re "$REGEX")" = "1" ] && ok || fail
 
+SOURCE="$DLOG_CONFIG_PATH"
+DLOG_CONFIG_PATH="$TESTDIR/defaultprintformat.conf"
+cp "$SOURCE" "$DLOG_CONFIG_PATH"
+
+# TODO: It would be good to also test the daemon side of things.
+LOG_DETAILS="testing default log format selection (none -> brief)"
+REGEX="s/^$regex_prio\/[[:print:]]{8,}\([0-9[:space:]]{5,}\):\s{1}[[:print:]]*$/1/g"
+line=$($cmd_prefix_no_v)
+[ "$(echo "$line" | sed -re "$REGEX")" = "1" ] && ok || fail
+
+echo "util_default_format=rwtime" >> $DLOG_CONFIG_PATH
+LOG_DETAILS="testing default log format selection (rwtime)"
+REGEX="s/^$regex_time\s{1}\[[0-9[:space:]]{3,}.[0-9[:space:]]{3,}\]\s{1}$regex_prio\/[[:print:]]{8,}\($regex_pidtid\):\s{1}[[:print:]]*$/1/g"
+line=$($cmd_prefix_no_v)
+[ "$(echo "$line" | sed -re "$REGEX")" = "1" ] && ok || fail
+
+DLOG_CONFIG_PATH="$SOURCE"
+
 format="raw"
 LOG_DETAILS="testing if \"$format\" print format works"
 dlogutil -c