summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-09-07 23:40:00 +0200
committerLennart Poettering <lennart@poettering.net>2012-09-07 23:40:00 +0200
commit182b858fc2e61e34cd9911c291580659b2cb72b4 (patch)
tree89d799eb5aa5e9caeaa6ad3c9765b5cfe2687b7b
parenta1a03e3075316e2376176fc54c74e071adc9d71a (diff)
journald: make splitting up of journal files per-user configurable
-rw-r--r--man/journald.conf.xml30
-rw-r--r--src/journal/journald-gperf.gperf1
-rw-r--r--src/journal/journald.c14
-rw-r--r--src/journal/journald.conf1
-rw-r--r--src/journal/journald.h14
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);