journald: make splitting up of journal files per-user configurable

This commit is contained in:
Lennart Poettering 2012-09-07 23:40:00 +02:00
parent a1a03e3075
commit 182b858fc2
5 changed files with 59 additions and 1 deletions

View File

@ -135,6 +135,36 @@
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>

View 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)

View 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);

View File

@ -11,6 +11,7 @@
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=login
#RateLimitInterval=10s
#RateLimitBurst=200
#SystemMaxUse=

View 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);