]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxc_conf logfile and loglevel support
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 3 Dec 2012 18:53:46 +0000 (12:53 -0600)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Tue, 4 Dec 2012 17:38:25 +0000 (11:38 -0600)
Add 'lxc.logfile' and 'lxc.loglevel' config items.  Values provided on
the command line override the config items.

Have lxccontainer not set a default loglevel and logfile.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/conf.c
src/lxc/conf.h
src/lxc/confile.c
src/lxc/log.c
src/lxc/log.h
src/lxc/lxccontainer.c

index 65e19a9534f655b04a8d68c2f11c92cf904f9fda..79d96d70fc124860308657a1660626c93a1676de 100644 (file)
@@ -1877,6 +1877,7 @@ struct lxc_conf *lxc_conf_init(void)
        new->console.slave = -1;
        new->console.name[0] = '\0';
        new->rootfs.mount = default_rootfs_mount;
+       new->loglevel = LXC_LOG_PRIORITY_NOTSET;
        lxc_list_init(&new->cgroup);
        lxc_list_init(&new->network);
        lxc_list_init(&new->mount_list);
@@ -2725,6 +2726,8 @@ void lxc_conf_free(struct lxc_conf *conf)
                free(conf->ttydir);
        if (conf->fstab)
                free(conf->fstab);
+       if (conf->logfile)
+               free(conf->logfile);
        lxc_clear_config_network(conf);
 #if HAVE_APPARMOR
        if (conf->aa_profile)
index 535823d9dcaf55208ecda83dccaf44cce4de8a4f..694bce48e78a6c9d95a24b23879e6f34e5626d6f 100644 (file)
@@ -232,6 +232,9 @@ struct lxc_conf {
 #if HAVE_APPARMOR
        char *aa_profile;
 #endif
+       char *logfile;
+       int loglevel;
+
 #if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */
        int lsm_umount_proc;
 #endif
index bc55f8c11d6ea3c7470872c36772b85cc29176d8..a64ae0940a5389c7100d3e96c1525a120be8e6ac 100644 (file)
@@ -55,6 +55,8 @@ static int config_ttydir(const char *, const char *, struct lxc_conf *);
 static int config_aa_profile(const char *, const char *, struct lxc_conf *);
 #endif
 static int config_cgroup(const char *, const char *, struct lxc_conf *);
+static int config_loglevel(const char *, const char *, struct lxc_conf *);
+static int config_logfile(const char *, const char *, struct lxc_conf *);
 static int config_mount(const char *, const char *, struct lxc_conf *);
 static int config_rootfs(const char *, const char *, struct lxc_conf *);
 static int config_rootfs_mount(const char *, const char *, struct lxc_conf *);
@@ -92,6 +94,8 @@ static struct lxc_config_t config[] = {
        { "lxc.aa_profile",            config_aa_profile          },
 #endif
        { "lxc.cgroup",               config_cgroup               },
+       { "lxc.loglevel",             config_loglevel             },
+       { "lxc.logfile",              config_logfile              },
        { "lxc.mount",                config_mount                },
        { "lxc.rootfs.mount",         config_rootfs_mount         },
        { "lxc.rootfs",               config_rootfs               },
@@ -903,6 +907,51 @@ static int config_aa_profile(const char *key, const char *value,
 }
 #endif
 
+static int config_logfile(const char *key, const char *value,
+                            struct lxc_conf *lxc_conf)
+{
+       char *path;
+
+       // if given a blank entry, null out any previous entries.
+       if (!value || strlen(value) == 0) {
+               if (lxc_conf->logfile) {
+                       free(lxc_conf->logfile);
+                       lxc_conf->logfile = NULL;
+               }
+               return 0;
+       }
+
+       path = strdup(value);
+       if (!path) {
+               SYSERROR("failed to strdup '%s': %m", value);
+               return -1;
+       }
+
+       if (lxc_log_set_file(path)) {
+               free(path);
+               return -1;
+       }
+
+       if (lxc_conf->logfile)
+               free(lxc_conf->logfile);
+       lxc_conf->logfile = path;
+
+       return 0;
+}
+
+static int config_loglevel(const char *key, const char *value,
+                            struct lxc_conf *lxc_conf)
+{
+       if (!value || strlen(value) == 0)
+               return 0;
+
+       if (value[0] >= '0' && value[0] <= '9')
+               lxc_conf->loglevel = atoi(value);
+       else
+               lxc_conf->loglevel = lxc_log_priority_to_int(value);
+       return lxc_log_set_level(lxc_conf->loglevel);
+}
+
 static int config_autodev(const char *key, const char *value,
                          struct lxc_conf *lxc_conf)
 {
@@ -1526,7 +1575,7 @@ static int lxc_get_item_network(struct lxc_conf *c, char *retv, int inlen)
 int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
                        int inlen)
 {
-       char *v = NULL;
+       const char *v = NULL;
 
        if (strcmp(key, "lxc.mount.entry") == 0)
                return lxc_get_mount_entries(c, retv, inlen);
@@ -1544,6 +1593,10 @@ int lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
        else if (strcmp(key, "lxc.aa_profile") == 0)
                v = c->aa_profile;
 #endif
+       else if (strcmp(key, "lxc.logfile") == 0)
+               v = c->logfile;
+       else if (strcmp(key, "lxc.loglevel") == 0)
+               v = lxc_log_priority_to_string(c->loglevel);
        else if (strcmp(key, "lxc.cgroup") == 0) // all cgroup info
                return lxc_get_cgroup_entry(c, retv, inlen, "all");
        else if (strncmp(key, "lxc.cgroup.", 11) == 0) // specific cgroup info
@@ -1621,6 +1674,9 @@ void write_config(FILE *fout, struct lxc_conf *c)
        if (c->aa_profile)
                fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile);
 #endif
+       fprintf(fout, "lxc.loglevel = %s\n", lxc_log_priority_to_string(c->loglevel));
+       if (c->logfile)
+               fprintf(fout, "lxc.logfile = %s\n", c->logfile);
        lxc_list_for_each(it, &c->cgroup) {
                struct lxc_cgroup *cg = it->elem;
                fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value);
index 02ee21cfeea2fd1a780d014267286a9b165e9aed..0354d8dfcc8622a80a9958f94c99a46f7c044b59 100644 (file)
@@ -41,6 +41,7 @@
 
 int lxc_log_fd = -1;
 static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc";
+int lxc_loglevel_specified = 0;
 
 lxc_log_define(lxc_log, lxc);
 
@@ -157,6 +158,7 @@ extern int lxc_log_init(const char *file, const char *priority,
                return 0;
 
        if (priority) {
+               lxc_loglevel_specified = 1;
                lxc_priority = lxc_log_priority_to_int(priority);
 
                if (lxc_priority == LXC_LOG_PRIORITY_NOTSET) {
@@ -188,3 +190,39 @@ extern int lxc_log_init(const char *file, const char *priority,
 
        return 0;
 }
+
+/*
+ * This is called when we read a lxc.loglevel entry in a lxc.conf file.  This
+ * happens after processing command line arguments, which override the .conf
+ * settings.  So only set the level if previously unset.
+ */
+extern int lxc_log_set_level(int level)
+{
+       if (lxc_loglevel_specified)
+               return 0;
+       if (level < 0 || level >= LXC_LOG_PRIORITY_NOTSET) {
+               ERROR("invalid log priority %d", level);
+               return -1;
+       }
+       lxc_log_category_lxc.priority = level;
+       return 0;
+}
+
+/*
+ * This is called when we read a lxc.logfile entry in a lxc.conf file.  This
+ * happens after processing command line arguments, which override the .conf
+ * settings.  So only set the logfile if previously unset.
+ */
+extern int lxc_log_set_file(char *fname)
+{
+       if (lxc_log_fd != -1) {
+               INFO("Configuration file was specified on command line, configuration file entry being ignored");
+               return 0;
+       }
+       lxc_log_fd = log_open(fname);
+       if (lxc_log_fd == -1) {
+               ERROR("failed to open log file %s\n", fname);
+               return -1;
+       }
+       return 0;
+}
index b11093d1e0731658b809990df0d404bfbd4e1f0f..340a3abd5ddc2f0f711e6dea991277343b3b2655 100644 (file)
@@ -41,7 +41,7 @@
 #define LXC_LOG_BUFFER_SIZE    512
 
 /* predefined priorities. */
-enum {
+enum lxc_loglevel {
        LXC_LOG_PRIORITY_TRACE,
        LXC_LOG_PRIORITY_DEBUG,
        LXC_LOG_PRIORITY_INFO,
@@ -291,4 +291,6 @@ extern int lxc_log_init(const char *file, const char *priority,
                        const char *prefix, int quiet);
 
 extern void lxc_log_setprefix(const char *a_prefix);
+extern int lxc_log_set_level(int level);
+extern int lxc_log_set_file(char *fname);
 #endif
index e41fd0dbf890db4b4b7263b43bc22b40e7589710..d25b8486d0c9e9703175e03553b3971fcfff00d5 100644 (file)
@@ -922,7 +922,7 @@ struct lxc_container *lxc_container_new(const char *name)
        c->get_config_item = lxcapi_get_config_item;
 
        /* we'll allow the caller to update these later */
-       if (lxc_log_init("/var/log/lxccontainer.log", "trace", "lxc_container", 0)) {
+       if (lxc_log_init(NULL, NULL, "lxc_container", 0)) {
                fprintf(stderr, "failed to open log\n");
                goto err;
        }