summaryrefslogtreecommitdiff
path: root/src/core/cgroup.c
diff options
context:
space:
mode:
authorQuentin Deslandes <qde@naccy.de>2022-11-07 20:30:01 +0100
committerQuentin Deslandes <qde@naccy.de>2022-12-15 09:57:39 +0000
commit523ea1237a3db96c98eae02d87ec189816437c4c (patch)
tree76f5b68b17b97d087894a3fb8dfaac2dda9c8a89 /src/core/cgroup.c
parent96c648fecde74ed48270b2d6e29d11b12bf2e2b9 (diff)
downloadsystemd-523ea1237a3db96c98eae02d87ec189816437c4c.tar.gz
journal: log filtering options support in PID1
Define new unit parameter (LogFilterPatterns) to filter logs processed by journald. This option is used to store a regular expression which is carried from PID1 to systemd-journald through a cgroup xattrs: `user.journald_log_filter_patterns`.
Diffstat (limited to 'src/core/cgroup.c')
-rw-r--r--src/core/cgroup.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index ecc3cb32ef..2d671566ac 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -781,6 +781,51 @@ void cgroup_oomd_xattr_apply(Unit *u, const char *cgroup_path) {
unit_remove_xattr_graceful(u, cgroup_path, "user.oomd_omit");
}
+int cgroup_log_xattr_apply(Unit *u, const char *cgroup_path) {
+ ExecContext *c;
+ size_t len, allowed_patterns_len, denied_patterns_len;
+ _cleanup_free_ char *patterns = NULL, *allowed_patterns = NULL, *denied_patterns = NULL;
+ int r;
+
+ assert(u);
+
+ c = unit_get_exec_context(u);
+ if (!c)
+ /* Some unit types have a cgroup context but no exec context, so we do not log
+ * any error here to avoid confusion. */
+ return 0;
+
+ if (set_isempty(c->log_filter_allowed_patterns) && set_isempty(c->log_filter_denied_patterns)) {
+ unit_remove_xattr_graceful(u, cgroup_path, "user.journald_log_filter_patterns");
+ return 0;
+ }
+
+ r = set_make_nulstr(c->log_filter_allowed_patterns, &allowed_patterns, &allowed_patterns_len);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to make nulstr from set: %m");
+
+ r = set_make_nulstr(c->log_filter_denied_patterns, &denied_patterns, &denied_patterns_len);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to make nulstr from set: %m");
+
+ /* Use nul character separated strings without trailing nul */
+ allowed_patterns_len = LESS_BY(allowed_patterns_len, 1u);
+ denied_patterns_len = LESS_BY(denied_patterns_len, 1u);
+
+ len = allowed_patterns_len + 1 + denied_patterns_len;
+ patterns = new(char, len);
+ if (!patterns)
+ return log_oom_debug();
+
+ memcpy_safe(patterns, allowed_patterns, allowed_patterns_len);
+ patterns[allowed_patterns_len] = '\xff';
+ memcpy_safe(&patterns[allowed_patterns_len + 1], denied_patterns, denied_patterns_len);
+
+ unit_set_xattr_graceful(u, cgroup_path, "user.journald_log_filter_patterns", patterns, len);
+
+ return 0;
+}
+
static void cgroup_xattr_apply(Unit *u) {
bool b;
@@ -788,6 +833,7 @@ static void cgroup_xattr_apply(Unit *u) {
/* The 'user.*' xattrs can be set from a user manager. */
cgroup_oomd_xattr_apply(u, u->cgroup_path);
+ cgroup_log_xattr_apply(u, u->cgroup_path);
if (!MANAGER_IS_SYSTEM(u->manager))
return;