diff options
-rw-r--r-- | man/journald.conf.xml | 30 | ||||
-rw-r--r-- | src/journal/journald-gperf.gperf | 1 | ||||
-rw-r--r-- | src/journal/journald.c | 14 | ||||
-rw-r--r-- | src/journal/journald.conf | 1 | ||||
-rw-r--r-- | src/journal/journald.h | 14 |
5 files changed, 59 insertions, 1 deletions
diff --git a/man/journald.conf.xml b/man/journald.conf.xml index 2fa475c94c..942560c687 100644 --- a/man/journald.conf.xml +++ b/man/journald.conf.xml @@ -136,6 +136,36 @@ </varlistentry> <varlistentry> + <term><varname>SplitMode=</varname></term> + + <listitem><para>Controls whether to + split up journal files per user. One + of <literal>login</literal>, + <literal>uid</literal> and + <literal>none</literal>. If + <literal>login</literal> each logged + in user will get his own journal + files, but systemd user IDs will log + into the system journal. If + <literal>uid</literal> 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 + <literal>none</literal> 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 + <literal>login</literal>.</para></listitem> + </varlistentry> + + <varlistentry> <term><varname>RateLimitInterval=</varname></term> <term><varname>RateLimitBurst=</varname></term> diff --git a/src/journal/journald-gperf.gperf b/src/journal/journald-gperf.gperf index 32474df6da..4c021edb52 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 5d0d2033f2..a3167712bb 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 677f48b7e3..e5f3b76a68 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 7f621aee18..c126d198b1 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); |