mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-27 09:48:32 +00:00
lxc_conf logfile and loglevel support
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>
This commit is contained in:
parent
44d397891e
commit
4a85ce2ad0
@ -1877,6 +1877,7 @@ struct lxc_conf *lxc_conf_init(void)
|
|||||||
new->console.slave = -1;
|
new->console.slave = -1;
|
||||||
new->console.name[0] = '\0';
|
new->console.name[0] = '\0';
|
||||||
new->rootfs.mount = default_rootfs_mount;
|
new->rootfs.mount = default_rootfs_mount;
|
||||||
|
new->loglevel = LXC_LOG_PRIORITY_NOTSET;
|
||||||
lxc_list_init(&new->cgroup);
|
lxc_list_init(&new->cgroup);
|
||||||
lxc_list_init(&new->network);
|
lxc_list_init(&new->network);
|
||||||
lxc_list_init(&new->mount_list);
|
lxc_list_init(&new->mount_list);
|
||||||
@ -2725,6 +2726,8 @@ void lxc_conf_free(struct lxc_conf *conf)
|
|||||||
free(conf->ttydir);
|
free(conf->ttydir);
|
||||||
if (conf->fstab)
|
if (conf->fstab)
|
||||||
free(conf->fstab);
|
free(conf->fstab);
|
||||||
|
if (conf->logfile)
|
||||||
|
free(conf->logfile);
|
||||||
lxc_clear_config_network(conf);
|
lxc_clear_config_network(conf);
|
||||||
#if HAVE_APPARMOR
|
#if HAVE_APPARMOR
|
||||||
if (conf->aa_profile)
|
if (conf->aa_profile)
|
||||||
|
@ -232,6 +232,9 @@ struct lxc_conf {
|
|||||||
#if HAVE_APPARMOR
|
#if HAVE_APPARMOR
|
||||||
char *aa_profile;
|
char *aa_profile;
|
||||||
#endif
|
#endif
|
||||||
|
char *logfile;
|
||||||
|
int loglevel;
|
||||||
|
|
||||||
#if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */
|
#if HAVE_APPARMOR /* || HAVE_SELINUX || HAVE_SMACK */
|
||||||
int lsm_umount_proc;
|
int lsm_umount_proc;
|
||||||
#endif
|
#endif
|
||||||
|
@ -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 *);
|
static int config_aa_profile(const char *, const char *, struct lxc_conf *);
|
||||||
#endif
|
#endif
|
||||||
static int config_cgroup(const char *, const char *, struct lxc_conf *);
|
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_mount(const char *, const char *, struct lxc_conf *);
|
||||||
static int config_rootfs(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 *);
|
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 },
|
{ "lxc.aa_profile", config_aa_profile },
|
||||||
#endif
|
#endif
|
||||||
{ "lxc.cgroup", config_cgroup },
|
{ "lxc.cgroup", config_cgroup },
|
||||||
|
{ "lxc.loglevel", config_loglevel },
|
||||||
|
{ "lxc.logfile", config_logfile },
|
||||||
{ "lxc.mount", config_mount },
|
{ "lxc.mount", config_mount },
|
||||||
{ "lxc.rootfs.mount", config_rootfs_mount },
|
{ "lxc.rootfs.mount", config_rootfs_mount },
|
||||||
{ "lxc.rootfs", config_rootfs },
|
{ "lxc.rootfs", config_rootfs },
|
||||||
@ -903,6 +907,51 @@ static int config_aa_profile(const char *key, const char *value,
|
|||||||
}
|
}
|
||||||
#endif
|
#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,
|
static int config_autodev(const char *key, const char *value,
|
||||||
struct lxc_conf *lxc_conf)
|
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 lxc_get_config_item(struct lxc_conf *c, const char *key, char *retv,
|
||||||
int inlen)
|
int inlen)
|
||||||
{
|
{
|
||||||
char *v = NULL;
|
const char *v = NULL;
|
||||||
|
|
||||||
if (strcmp(key, "lxc.mount.entry") == 0)
|
if (strcmp(key, "lxc.mount.entry") == 0)
|
||||||
return lxc_get_mount_entries(c, retv, inlen);
|
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)
|
else if (strcmp(key, "lxc.aa_profile") == 0)
|
||||||
v = c->aa_profile;
|
v = c->aa_profile;
|
||||||
#endif
|
#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
|
else if (strcmp(key, "lxc.cgroup") == 0) // all cgroup info
|
||||||
return lxc_get_cgroup_entry(c, retv, inlen, "all");
|
return lxc_get_cgroup_entry(c, retv, inlen, "all");
|
||||||
else if (strncmp(key, "lxc.cgroup.", 11) == 0) // specific cgroup info
|
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)
|
if (c->aa_profile)
|
||||||
fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile);
|
fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile);
|
||||||
#endif
|
#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) {
|
lxc_list_for_each(it, &c->cgroup) {
|
||||||
struct lxc_cgroup *cg = it->elem;
|
struct lxc_cgroup *cg = it->elem;
|
||||||
fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value);
|
fprintf(fout, "lxc.cgroup.%s = %s\n", cg->subsystem, cg->value);
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
int lxc_log_fd = -1;
|
int lxc_log_fd = -1;
|
||||||
static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc";
|
static char log_prefix[LXC_LOG_PREFIX_SIZE] = "lxc";
|
||||||
|
int lxc_loglevel_specified = 0;
|
||||||
|
|
||||||
lxc_log_define(lxc_log, lxc);
|
lxc_log_define(lxc_log, lxc);
|
||||||
|
|
||||||
@ -157,6 +158,7 @@ extern int lxc_log_init(const char *file, const char *priority,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (priority) {
|
if (priority) {
|
||||||
|
lxc_loglevel_specified = 1;
|
||||||
lxc_priority = lxc_log_priority_to_int(priority);
|
lxc_priority = lxc_log_priority_to_int(priority);
|
||||||
|
|
||||||
if (lxc_priority == LXC_LOG_PRIORITY_NOTSET) {
|
if (lxc_priority == LXC_LOG_PRIORITY_NOTSET) {
|
||||||
@ -188,3 +190,39 @@ extern int lxc_log_init(const char *file, const char *priority,
|
|||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
#define LXC_LOG_BUFFER_SIZE 512
|
#define LXC_LOG_BUFFER_SIZE 512
|
||||||
|
|
||||||
/* predefined priorities. */
|
/* predefined priorities. */
|
||||||
enum {
|
enum lxc_loglevel {
|
||||||
LXC_LOG_PRIORITY_TRACE,
|
LXC_LOG_PRIORITY_TRACE,
|
||||||
LXC_LOG_PRIORITY_DEBUG,
|
LXC_LOG_PRIORITY_DEBUG,
|
||||||
LXC_LOG_PRIORITY_INFO,
|
LXC_LOG_PRIORITY_INFO,
|
||||||
@ -291,4 +291,6 @@ extern int lxc_log_init(const char *file, const char *priority,
|
|||||||
const char *prefix, int quiet);
|
const char *prefix, int quiet);
|
||||||
|
|
||||||
extern void lxc_log_setprefix(const char *a_prefix);
|
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
|
#endif
|
||||||
|
@ -922,7 +922,7 @@ struct lxc_container *lxc_container_new(const char *name)
|
|||||||
c->get_config_item = lxcapi_get_config_item;
|
c->get_config_item = lxcapi_get_config_item;
|
||||||
|
|
||||||
/* we'll allow the caller to update these later */
|
/* 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");
|
fprintf(stderr, "failed to open log\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user