From 182b858fc2e61e34cd9911c291580659b2cb72b4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 7 Sep 2012 23:40:00 +0200 Subject: [PATCH] journald: make splitting up of journal files per-user configurable --- man/journald.conf.xml | 30 ++++++++++++++++++++++++++++++ src/journal/journald-gperf.gperf | 1 + src/journal/journald.c | 14 +++++++++++++- src/journal/journald.conf | 1 + src/journal/journald.h | 14 ++++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/man/journald.conf.xml b/man/journald.conf.xml index 2fa475c94..942560c68 100644 --- a/man/journald.conf.xml +++ b/man/journald.conf.xml @@ -135,6 +135,36 @@ enabled. + + SplitMode= + + Controls whether to + split up journal files per user. One + of login, + uid and + none. If + login each logged + in user will get his own journal + files, but systemd user IDs will log + into the system journal. If + uid any user ID + will get his own journal files + regardless whether it belongs to a + system service or refers to a real + logged in user. If + none journal files + are not split up per-user and all + messages are stored in the single + system journal. Note that splitting + up journal files per-user is only + available of journals are stored + persistently. If journals are stored + on volatile storage (see above) only a + single journal file for all user IDs + is kept. Defaults to + login. + + RateLimitInterval= RateLimitBurst= diff --git a/src/journal/journald-gperf.gperf b/src/journal/journald-gperf.gperf index 32474df6d..4c021edb5 100644 --- a/src/journal/journald-gperf.gperf +++ b/src/journal/journald-gperf.gperf @@ -36,3 +36,4 @@ Journal.MaxLevelStore, config_parse_level, 0, offsetof(Server, max_leve Journal.MaxLevelSyslog, config_parse_level, 0, offsetof(Server, max_level_syslog) Journal.MaxLevelKMsg, config_parse_level, 0, offsetof(Server, max_level_kmsg) Journal.MaxLevelConsole, config_parse_level, 0, offsetof(Server, max_level_console) +Journal.SplitMode, config_parse_split_mode,0, offsetof(Server, split_mode) diff --git a/src/journal/journald.c b/src/journal/journald.c index 5d0d2033f..a3167712b 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -87,6 +87,15 @@ static const char* const storage_table[] = { DEFINE_STRING_TABLE_LOOKUP(storage, Storage); DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting"); +static const char* const split_mode_table[] = { + [SPLIT_NONE] = "none", + [SPLIT_UID] = "uid", + [SPLIT_LOGIN] = "login" +}; + +DEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode); +DEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting"); + static uint64_t available_space(Server *s) { char ids[33], *p; const char *f; @@ -659,7 +668,10 @@ static void dispatch_message_real( assert(n <= m); - write_to_journal(s, realuid == 0 ? 0 : loginuid, iovec, n); + write_to_journal(s, + s->split_mode == SPLIT_NONE ? 0 : + (s->split_mode == SPLIT_UID ? realuid : + (realuid == 0 ? 0 : loginuid)), iovec, n); free(pid); free(uid); diff --git a/src/journal/journald.conf b/src/journal/journald.conf index 677f48b7e..e5f3b76a6 100644 --- a/src/journal/journald.conf +++ b/src/journal/journald.conf @@ -11,6 +11,7 @@ #Storage=auto #Compress=yes #Seal=yes +#SplitMode=login #RateLimitInterval=10s #RateLimitBurst=200 #SystemMaxUse= diff --git a/src/journal/journald.h b/src/journal/journald.h index 7f621aee1..c126d198b 100644 --- a/src/journal/journald.h +++ b/src/journal/journald.h @@ -41,6 +41,14 @@ typedef enum Storage { _STORAGE_INVALID = -1 } Storage; +typedef enum SplitMode { + SPLIT_LOGIN, + SPLIT_UID, + SPLIT_NONE, + _SPLIT_MAX, + _SPLIT_INVALID = -1 +} SplitMode; + typedef struct StdoutStream StdoutStream; typedef struct Server { @@ -93,6 +101,7 @@ typedef struct Server { int max_level_console; Storage storage; + SplitMode split_mode; MMapCache *mmap; @@ -117,3 +126,8 @@ int config_parse_storage(const char *filename, unsigned line, const char *sectio const char *storage_to_string(Storage s); Storage storage_from_string(const char *s); + +int config_parse_split_mode(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); + +const char *split_mode_to_string(SplitMode s); +SplitMode split_mode_from_string(const char *s); -- 2.30.2