chiark / gitweb /
journald: make splitting up of journal files per-user configurable
authorLennart Poettering <lennart@poettering.net>
Fri, 7 Sep 2012 21:40:00 +0000 (23:40 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 7 Sep 2012 21:40:00 +0000 (23:40 +0200)
man/journald.conf.xml
src/journal/journald-gperf.gperf
src/journal/journald.c
src/journal/journald.conf
src/journal/journald.h

index 2fa475c94c8220c7bd54062be30abc177daadab3..942560c6875f60231bac5848e1d2417afb8f8282 100644 (file)
                                 enabled.</para></listitem>
                         </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>
index 32474df6daeff5ff7266068095a12cb66eaff899..4c021edb5256c8875ec8daa4c36cfcd3c2c95e73 100644 (file)
@@ -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)
index 5d0d2033f2c3425d3ba80d9d1c2cf668c32fc575..a3167712bb9f6322b26c66ef242e4b9b786803e3 100644 (file)
@@ -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);
index 677f48b7e30ac6c08923eed6d424a5b61d933072..e5f3b76a68fc5794e52ba465e4d8b907e2bdcff6 100644 (file)
@@ -11,6 +11,7 @@
 #Storage=auto
 #Compress=yes
 #Seal=yes
+#SplitMode=login
 #RateLimitInterval=10s
 #RateLimitBurst=200
 #SystemMaxUse=
index 7f621aee1823cd7e9705bd48bd216399066429b2..c126d198b10ad036ac26a4b14b0260fcdd1e54c1 100644 (file)
@@ -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);