Merge pull request #31899 from yuwata/sd-journal-add-match

sd-journal: introduce two helpers for adding journal filter
This commit is contained in:
Yu Watanabe
2024-03-26 02:56:58 +09:00
committed by GitHub
6 changed files with 82 additions and 90 deletions
+17 -15
View File
@@ -74,29 +74,31 @@ STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep);
static int add_match(sd_journal *j, const char *match) {
_cleanup_free_ char *p = NULL;
const char* prefix, *pattern;
pid_t pid;
const char *field;
int r;
if (strchr(match, '='))
prefix = "";
else if (strchr(match, '/')) {
field = NULL;
else if (is_path(match)) {
r = path_make_absolute_cwd(match, &p);
if (r < 0)
return log_error_errno(r, "path_make_absolute_cwd(\"%s\"): %m", match);
match = p;
prefix = "COREDUMP_EXE=";
} else if (parse_pid(match, &pid) >= 0)
prefix = "COREDUMP_PID=";
field = "COREDUMP_EXE";
} else if (parse_pid(match, NULL) >= 0)
field = "COREDUMP_PID";
else
prefix = "COREDUMP_COMM=";
field = "COREDUMP_COMM";
pattern = strjoina(prefix, match);
log_debug("Adding match: %s", pattern);
r = sd_journal_add_match(j, pattern, 0);
log_debug("Adding match: %s%s%s", strempty(field), field ? "=" : "", match);
if (field)
r = journal_add_match_pair(j, field, match);
else
r = sd_journal_add_match(j, match, 0);
if (r < 0)
return log_error_errno(r, "Failed to add match \"%s\": %m", match);
return log_error_errno(r, "Failed to add match \"%s%s%s\": %m",
strempty(field), field ? "=" : "", match);
return 0;
}
@@ -877,7 +879,7 @@ static int dump_list(int argc, char **argv, void *userdata) {
verb_is_info = argc >= 1 && streq(argv[0], "info");
r = acquire_journal(&j, argv + 1);
r = acquire_journal(&j, strv_skip(argv, 1));
if (r < 0)
return r;
@@ -1128,7 +1130,7 @@ static int dump_core(int argc, char **argv, void *userdata) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Option --field/-F only makes sense with list");
r = acquire_journal(&j, argv + 1);
r = acquire_journal(&j, strv_skip(argv, 1));
if (r < 0)
return r;
@@ -1201,7 +1203,7 @@ static int run_debug(int argc, char **argv, void *userdata) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Option --field/-F only makes sense with list");
r = acquire_journal(&j, argv + 1);
r = acquire_journal(&j, strv_skip(argv, 1));
if (r < 0)
return r;
+3 -11
View File
@@ -22,6 +22,7 @@
#include "fileio.h"
#include "glob-util.h"
#include "hostname-util.h"
#include "journal-internal.h"
#include "journal-remote.h"
#include "log.h"
#include "logs-show.h"
@@ -460,7 +461,6 @@ static mhd_result request_parse_arguments_iterator(
const char *value) {
RequestMeta *m = ASSERT_PTR(cls);
_cleanup_free_ char *p = NULL;
int r;
if (isempty(key)) {
@@ -512,7 +512,6 @@ static mhd_result request_parse_arguments_iterator(
}
if (r) {
char match[9 + 32 + 1] = "_BOOT_ID=";
sd_id128_t bid;
r = sd_id128_get_boot(&bid);
@@ -521,8 +520,7 @@ static mhd_result request_parse_arguments_iterator(
return MHD_NO;
}
sd_id128_to_string(bid, match + 9);
r = sd_journal_add_match(m->journal, match, sizeof(match)-1);
r = add_match_boot_id(m->journal, bid);
if (r < 0) {
m->argument_parse_error = r;
return MHD_NO;
@@ -532,13 +530,7 @@ static mhd_result request_parse_arguments_iterator(
return MHD_YES;
}
p = strjoin(key, "=", strempty(value));
if (!p) {
m->argument_parse_error = log_oom();
return MHD_NO;
}
r = sd_journal_add_match(m->journal, p, 0);
r = journal_add_match_pair(m->journal, key, strempty(value));
if (r < 0) {
m->argument_parse_error = r;
return MHD_NO;
@@ -140,6 +140,9 @@ char *journal_make_match_string(sd_journal *j);
void journal_print_header(sd_journal *j);
int journal_get_directories(sd_journal *j, char ***ret);
int journal_add_match_pair(sd_journal *j, const char *field, const char *value);
int journal_add_matchf(sd_journal *j, const char *format, ...) _printf_(2, 3);
#define JOURNAL_FOREACH_DATA_RETVAL(j, data, l, retval) \
for (sd_journal_restart_data(j); ((retval) = sd_journal_enumerate_data((j), &(data), &(l))) > 0; )
+31
View File
@@ -325,6 +325,37 @@ fail:
return -ENOMEM;
}
int journal_add_match_pair(sd_journal *j, const char *field, const char *value) {
_cleanup_free_ char *s = NULL;
assert(j);
assert(field);
assert(value);
s = strjoin(field, "=", value);
if (!s)
return -ENOMEM;
return sd_journal_add_match(j, s, 0);
}
int journal_add_matchf(sd_journal *j, const char *format, ...) {
_cleanup_free_ char *s = NULL;
va_list ap;
int r;
assert(j);
assert(format);
va_start(ap, format);
r = vasprintf(&s, format, ap);
va_end(ap);
if (r < 0)
return -ENOMEM;
return sd_journal_add_match(j, s, 0);
}
_public_ int sd_journal_add_conjunction(sd_journal *j) {
assert_return(j, -EINVAL);
assert_return(!journal_origin_changed(j), -ECHILD);
+5 -14
View File
@@ -37,6 +37,7 @@
#include "glob-util.h"
#include "hwdb-util.h"
#include "ipvlan-util.h"
#include "journal-internal.h"
#include "local-addresses.h"
#include "locale-util.h"
#include "logs-show.h"
@@ -1613,22 +1614,12 @@ static int show_logs(const LinkInfo *info) {
return log_error_errno(r, "Failed to add boot matches: %m");
if (info) {
char m1[STRLEN("_KERNEL_DEVICE=n") + DECIMAL_STR_MAX(int)];
const char *m2, *m3;
/* kernel */
xsprintf(m1, "_KERNEL_DEVICE=n%i", info->ifindex);
/* networkd */
m2 = strjoina("INTERFACE=", info->name);
/* udevd */
m3 = strjoina("DEVICE=", info->name);
(void)(
(r = sd_journal_add_match(j, m1, 0)) ||
(void) (
(r = journal_add_matchf(j, "_KERNEL_DEVICE=n%i", info->ifindex)) || /* kernel */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m2, 0)) ||
(r = journal_add_match_pair(j, "INTERFACE", info->name)) || /* networkd */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m3, 0))
(r = journal_add_match_pair(j, "DEVICE", info->name)) /* udevd */
);
if (r < 0)
return log_error_errno(r, "Failed to add link matches: %m");
+23 -50
View File
@@ -1562,102 +1562,78 @@ int show_journal(
}
int add_matches_for_unit(sd_journal *j, const char *unit) {
const char *m1, *m2, *m3, *m4;
int r;
assert(j);
assert(unit);
m1 = strjoina("_SYSTEMD_UNIT=", unit);
m2 = strjoina("COREDUMP_UNIT=", unit);
m3 = strjoina("UNIT=", unit);
m4 = strjoina("OBJECT_SYSTEMD_UNIT=", unit);
(void)(
(void) (
/* Look for messages from the service itself */
(r = sd_journal_add_match(j, m1, 0)) ||
(r = journal_add_match_pair(j, "_SYSTEMD_UNIT", unit)) ||
/* Look for coredumps of the service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, m2, 0)) ||
(r = journal_add_match_pair(j, "COREDUMP_UNIT", unit)) ||
/* Look for messages from PID 1 about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "_PID=1", 0)) ||
(r = sd_journal_add_match(j, m3, 0)) ||
(r = journal_add_match_pair(j, "UNIT", unit)) ||
/* Look for messages from authorized daemons about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
(r = sd_journal_add_match(j, m4, 0))
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_UNIT", unit))
);
if (r == 0 && endswith(unit, ".slice")) {
const char *m5;
m5 = strjoina("_SYSTEMD_SLICE=", unit);
if (r == 0 && endswith(unit, ".slice"))
/* Show all messages belonging to a slice */
(void)(
(void) (
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m5, 0))
);
}
(r = journal_add_match_pair(j, "_SYSTEMD_SLICE", unit))
);
return r;
}
int add_matches_for_user_unit(sd_journal *j, const char *unit, uid_t uid) {
int r;
char *m1, *m2, *m3, *m4;
char muid[sizeof("_UID=") + DECIMAL_STR_MAX(uid_t)];
assert(j);
assert(unit);
m1 = strjoina("_SYSTEMD_USER_UNIT=", unit);
m2 = strjoina("USER_UNIT=", unit);
m3 = strjoina("COREDUMP_USER_UNIT=", unit);
m4 = strjoina("OBJECT_SYSTEMD_USER_UNIT=", unit);
sprintf(muid, "_UID="UID_FMT, uid);
(void) (
/* Look for messages from the user service itself */
(r = sd_journal_add_match(j, m1, 0)) ||
(r = sd_journal_add_match(j, muid, 0)) ||
(r = journal_add_match_pair(j, "_SYSTEMD_USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
/* Look for messages from systemd about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m2, 0)) ||
(r = sd_journal_add_match(j, muid, 0)) ||
(r = journal_add_match_pair(j, "USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
/* Look for coredumps of the service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m3, 0)) ||
(r = sd_journal_add_match(j, muid, 0)) ||
(r = journal_add_match_pair(j, "COREDUMP_USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
(r = sd_journal_add_match(j, "_UID=0", 0)) ||
/* Look for messages from authorized daemons about this service */
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m4, 0)) ||
(r = sd_journal_add_match(j, muid, 0)) ||
(r = journal_add_match_pair(j, "OBJECT_SYSTEMD_USER_UNIT", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid)) ||
(r = sd_journal_add_match(j, "_UID=0", 0))
);
if (r == 0 && endswith(unit, ".slice")) {
const char *m5;
m5 = strjoina("_SYSTEMD_USER_SLICE=", unit);
if (r == 0 && endswith(unit, ".slice"))
/* Show all messages belonging to a slice */
(void)(
(void) (
(r = sd_journal_add_disjunction(j)) ||
(r = sd_journal_add_match(j, m5, 0)) ||
(r = sd_journal_add_match(j, muid, 0))
);
}
(r = journal_add_match_pair(j, "_SYSTEMD_USER_SLICE", unit)) ||
(r = journal_add_matchf(j, "_UID="UID_FMT, uid))
);
return r;
}
@@ -1730,13 +1706,10 @@ static int get_boot_id_for_machine(const char *machine, sd_id128_t *boot_id) {
}
int add_match_boot_id(sd_journal *j, sd_id128_t id) {
char match[STRLEN("_BOOT_ID=") + SD_ID128_STRING_MAX];
assert(j);
assert(!sd_id128_is_null(id));
sd_id128_to_string(id, stpcpy(match, "_BOOT_ID="));
return sd_journal_add_match(j, match, strlen(match));
return journal_add_match_pair(j, "_BOOT_ID", SD_ID128_TO_STRING(id));
}
int add_match_this_boot(sd_journal *j, const char *machine) {