Skip to content

Commit

Permalink
Allow multiple log drivers to be specified
Browse files Browse the repository at this point in the history
This extends the API to allow multiple log drivers in parallel. We can
later on support other drivers like files to log into multiple
destinations.

Signed-off-by: Sascha Grunert <[email protected]>
  • Loading branch information
saschagrunert committed Oct 4, 2022
1 parent e58ae5a commit 39bdb3f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 37 deletions.
13 changes: 7 additions & 6 deletions conmon-rs/server/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,18 @@ pub struct Config {
/// The logging level of the conmon server.
log_level: String,

#[get_copy = "pub"]
#[get = "pub"]
#[clap(
default_value(LogDriver::Systemd.into()),
env(concat!(prefix!(), "LOG_DRIVER")),
long("log-driver"),
env(concat!(prefix!(), "LOG_DRIVERS")),
multiple(true),
long("log-drivers"),
short('d'),
possible_values(LogDriver::iter().map(|x| x.into()).collect::<Vec<&str>>()),
value_name("DRIVER")
value_name("DRIVERS")
)]
/// The logging driver used by the conmon server.
log_driver: LogDriver,
/// The logging drivers used by the server. Can be specified multiple times.
log_drivers: Vec<LogDriver>,

#[get = "pub"]
#[clap(
Expand Down
48 changes: 25 additions & 23 deletions conmon-rs/server/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,30 +108,32 @@ impl Server {
LevelFilter::from_str(self.config().log_level()).context("convert log level filter")?;
let registry = tracing_subscriber::registry();

match self.config().log_driver() {
LogDriver::Stdout => {
let layer = tracing_subscriber::fmt::layer()
.with_target(true)
.with_line_number(true)
.with_filter(level);
registry
.with(layer)
.try_init()
.context("init stdout fmt layer")?;
info!("Using stdout logger");
}
LogDriver::Systemd => {
let layer = tracing_journald::layer()
.context("unable to connect to journald")?
.with_filter(level);
registry
.with(layer)
.try_init()
.context("init journald layer")?;
info!("Using systemd/journald logger");
}
}
let stdout = if self.config().log_drivers().contains(&LogDriver::Stdout) {
tracing_subscriber::fmt::layer()
.with_target(true)
.with_line_number(true)
.with_filter(level)
.into()
} else {
None
};

let systemd = if self.config().log_drivers().contains(&LogDriver::Systemd) {
tracing_journald::layer()
.context("unable to connect to journald")?
.with_filter(level)
.into()
} else {
None
};

registry
.with(stdout)
.with(systemd)
.try_init()
.context("init registry")?;
info!("Set log level to: {}", self.config().log_level());

Ok(())
}

Expand Down
26 changes: 18 additions & 8 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ type ConmonServerConfig struct {
// Can be "trace", "debug", "info", "warn", "error" or "off".
LogLevel string

// LogDriver is the possible server logging driver.
// Can be "stdout" or "systemd".
LogDriver string
// LogDrivers are the possible server logging drivers.
// Can be "stdout", "systemd" or both.
LogDrivers []string

// Runtime is the binary path of the OCI runtime to use to operate on the
// containers.
Expand Down Expand Up @@ -106,7 +106,7 @@ func NewConmonServerConfig(
) *ConmonServerConfig {
return &ConmonServerConfig{
LogLevel: LogLevelDebug,
LogDriver: LogDriverStdout,
LogDrivers: []string{LogDriverStdout},
Runtime: runtime,
RuntimeRoot: runtimeRoot,
ServerRunDir: serverRunDir,
Expand Down Expand Up @@ -212,7 +212,7 @@ func (c *ConmonClient) startServer(config *ConmonServerConfig) error {
Setpgid: true,
}

if config.LogDriver == LogDriverStdout {
if contains(config.LogDrivers, LogDriverStdout) {
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if config.Stdout != nil {
Expand All @@ -230,6 +230,16 @@ func (c *ConmonClient) startServer(config *ConmonServerConfig) error {
return nil
}

func contains[T comparable](haystack []T, needle T) bool {
for _, value := range haystack {
if value == needle {
return true
}
}

return false
}

func (c *ConmonClient) toArgs(config *ConmonServerConfig) (entrypoint string, args []string, err error) {
if c == nil {
return "", args, nil
Expand Down Expand Up @@ -263,11 +273,11 @@ func (c *ConmonClient) toArgs(config *ConmonServerConfig) (entrypoint string, ar
args = append(args, "--log-level", config.LogLevel)
}

if config.LogDriver != "" {
if err := validateLogDriver(config.LogDriver); err != nil {
for _, driver := range config.LogDrivers {
if err := validateLogDriver(driver); err != nil {
return "", args, fmt.Errorf("validate log driver: %w", err)
}
args = append(args, "--log-driver", config.LogDriver)
args = append(args, "--log-drivers", driver)
}

const cgroupManagerFlag = "--cgroup-manager"
Expand Down

0 comments on commit 39bdb3f

Please sign in to comment.