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 *);
{ "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 },
}
#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)
{
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);
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
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);
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);
return 0;
if (priority) {
+ lxc_loglevel_specified = 1;
lxc_priority = lxc_log_priority_to_int(priority);
if (lxc_priority == LXC_LOG_PRIORITY_NOTSET) {
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;
+}