From 5c692c9ed9471fa3e3fef64234cfe6b6fd3abfce Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Mon, 9 Jan 2017 11:21:51 -0800 Subject: [PATCH] Filter executor log messages --- client/config/config.go | 4 ++++ client/driver/docker.go | 2 +- client/driver/driver.go | 11 +++++++++-- client/driver/exec.go | 2 +- client/driver/executor/executor.go | 2 +- client/driver/java.go | 2 +- client/driver/plugins.go | 13 +++++++++++-- client/driver/qemu.go | 2 +- client/driver/raw_exec.go | 2 +- client/driver/rkt.go | 2 +- client/driver/utils.go | 27 +-------------------------- client/task_runner.go | 4 ++-- command/agent/agent.go | 1 + command/executor_plugin.go | 7 ++++--- command/syslog_plugin.go | 9 +++++---- 15 files changed, 44 insertions(+), 46 deletions(-) diff --git a/client/config/config.go b/client/config/config.go index d2806a8c7691..d6bb591cedb0 100644 --- a/client/config/config.go +++ b/client/config/config.go @@ -149,6 +149,9 @@ type Config struct { // TLSConfig holds various TLS related configurations TLSConfig *config.TLSConfig + + // LogLevel is the level of the logs to putout + LogLevel string } func (c *Config) Copy() *Config { @@ -172,6 +175,7 @@ func DefaultConfig() *Config { Region: "global", StatsCollectionInterval: 1 * time.Second, TLSConfig: &config.TLSConfig{}, + LogLevel: "DEBUG", } } diff --git a/client/driver/docker.go b/client/driver/docker.go index 7ac703d46fbf..d0bce9642f1d 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -390,7 +390,7 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle pluginLogFile := filepath.Join(ctx.TaskDir.Dir, "executor.out") pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/driver.go b/client/driver/driver.go index c20ac22bbbe2..8ffd966fc768 100644 --- a/client/driver/driver.go +++ b/client/driver/driver.go @@ -145,11 +145,18 @@ type ExecContext struct { // Alloc ID AllocID string + + // LogLevel is the level of the logs to putout + LogLevel string } // NewExecContext is used to create a new execution context -func NewExecContext(td *allocdir.TaskDir, allocID string) *ExecContext { - return &ExecContext{TaskDir: td, AllocID: allocID} +func NewExecContext(td *allocdir.TaskDir, allocID string, logLevel string) *ExecContext { + return &ExecContext{ + TaskDir: td, + AllocID: allocID, + LogLevel: logLevel, + } } // GetTaskEnv converts the alloc dir, the node, task and alloc into a diff --git a/client/driver/exec.go b/client/driver/exec.go index ac96bd2600bd..93e68cd1fa9e 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -116,7 +116,7 @@ func (d *ExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, } pluginLogFile := filepath.Join(ctx.TaskDir.Dir, "executor.out") pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index 10a52cc05bbb..3ff1f09d7efe 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -559,7 +559,7 @@ func (e *UniversalExecutor) pidStats() (map[string]*cstructs.ResourceUsage, erro for pid, np := range pids { p, err := process.NewProcess(int32(pid)) if err != nil { - e.logger.Printf("[DEBUG] executor: unable to create new process with pid: %v", pid) + e.logger.Printf("[TRACE] executor: unable to create new process with pid: %v", pid) continue } ms := &cstructs.MemoryStats{} diff --git a/client/driver/java.go b/client/driver/java.go index 6f2af363e460..4ce6b1093395 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -198,7 +198,7 @@ func (d *JavaDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, pluginLogFile := filepath.Join(ctx.TaskDir.Dir, "executor.out") pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } execIntf, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/plugins.go b/client/driver/plugins.go index 4808d81e1050..8818611b566b 100644 --- a/client/driver/plugins.go +++ b/client/driver/plugins.go @@ -2,10 +2,13 @@ package driver import ( "io" + "io/ioutil" "log" "net" + "strings" "github.com/hashicorp/go-plugin" + "github.com/hashicorp/logutils" ) var HandshakeConfig = plugin.HandshakeConfig{ @@ -14,9 +17,15 @@ var HandshakeConfig = plugin.HandshakeConfig{ MagicCookieValue: "e4327c2e01eabfd75a8a67adb114fb34a757d57eee7728d857a8cec6e91a7255", } -func GetPluginMap(w io.Writer) map[string]plugin.Plugin { +func GetPluginMap(w io.Writer, logLevel string) map[string]plugin.Plugin { e := new(ExecutorPlugin) - e.logger = log.New(w, "", log.LstdFlags) + filter := &logutils.LevelFilter{ + Levels: []logutils.LogLevel{"TRACE", "DEBUG", "INFO", "WARN", "ERR"}, + MinLevel: logutils.LogLevel(strings.ToUpper(logLevel)), + Writer: ioutil.Discard, + } + + e.logger = log.New(filter, "", log.LstdFlags) s := new(SyslogCollectorPlugin) s.logger = log.New(w, "", log.LstdFlags) diff --git a/client/driver/qemu.go b/client/driver/qemu.go index 9ad850c32597..f2fc0eee40b8 100644 --- a/client/driver/qemu.go +++ b/client/driver/qemu.go @@ -240,7 +240,7 @@ func (d *QemuDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, pluginLogFile := filepath.Join(ctx.TaskDir.Dir, "executor.out") pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/raw_exec.go b/client/driver/raw_exec.go index 972afe9e0645..942a9d57e6c7 100644 --- a/client/driver/raw_exec.go +++ b/client/driver/raw_exec.go @@ -130,7 +130,7 @@ func (d *RawExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandl } pluginLogFile := filepath.Join(ctx.TaskDir.Dir, "executor.out") pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/rkt.go b/client/driver/rkt.go index d3b0d9161d61..3e95a9d08011 100644 --- a/client/driver/rkt.go +++ b/client/driver/rkt.go @@ -401,7 +401,7 @@ func (d *RktDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, e pluginLogFile := filepath.Join(ctx.TaskDir.Dir, fmt.Sprintf("%s-executor.out", task.Name)) pluginConfig := &plugin.ClientConfig{ - Cmd: exec.Command(bin, "executor", pluginLogFile), + Cmd: exec.Command(bin, "executor", pluginLogFile, ctx.LogLevel), } execIntf, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) diff --git a/client/driver/utils.go b/client/driver/utils.go index 0e6fc2883d0c..9fc465bb3919 100644 --- a/client/driver/utils.go +++ b/client/driver/utils.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/go-plugin" "github.com/hashicorp/nomad/client/config" "github.com/hashicorp/nomad/client/driver/executor" - "github.com/hashicorp/nomad/client/driver/logging" cstructs "github.com/hashicorp/nomad/client/driver/structs" "github.com/hashicorp/nomad/nomad/structs" ) @@ -23,7 +22,7 @@ import ( func createExecutor(config *plugin.ClientConfig, w io.Writer, clientConfig *config.Config) (executor.Executor, *plugin.Client, error) { config.HandshakeConfig = HandshakeConfig - config.Plugins = GetPluginMap(w) + config.Plugins = GetPluginMap(w, clientConfig.LogLevel) config.MaxPort = clientConfig.ClientMaxPort config.MinPort = clientConfig.ClientMinPort @@ -47,30 +46,6 @@ func createExecutor(config *plugin.ClientConfig, w io.Writer, return executorPlugin, executorClient, nil } -func createLogCollector(config *plugin.ClientConfig, w io.Writer, - clientConfig *config.Config) (logging.LogCollector, *plugin.Client, error) { - config.HandshakeConfig = HandshakeConfig - config.Plugins = GetPluginMap(w) - config.MaxPort = clientConfig.ClientMaxPort - config.MinPort = clientConfig.ClientMinPort - if config.Cmd != nil { - isolateCommand(config.Cmd) - } - - syslogClient := plugin.NewClient(config) - rpcCLient, err := syslogClient.Client() - if err != nil { - return nil, nil, fmt.Errorf("error creating rpc client for syslog plugin: %v", err) - } - - raw, err := rpcCLient.Dispense("syslogcollector") - if err != nil { - return nil, nil, fmt.Errorf("unable to dispense the syslog plugin: %v", err) - } - logCollector := raw.(logging.LogCollector) - return logCollector, syslogClient, nil -} - func consulContext(clientConfig *config.Config, containerID string) *executor.ConsulContext { return &executor.ConsulContext{ ConsulConfig: clientConfig.ConsulConfig, diff --git a/client/task_runner.go b/client/task_runner.go index b9efbeba31c0..db06cdd0c40a 100644 --- a/client/task_runner.go +++ b/client/task_runner.go @@ -267,7 +267,7 @@ func (r *TaskRunner) RestoreState() error { return err } - ctx := driver.NewExecContext(r.taskDir, r.alloc.ID) + ctx := driver.NewExecContext(r.taskDir, r.alloc.ID, r.config.LogLevel) handle, err := d.Open(ctx, snap.HandleID) // In the case it fails, we relaunch the task in the Run() method. @@ -1071,7 +1071,7 @@ func (r *TaskRunner) startTask() error { } // Run prestart - ctx := driver.NewExecContext(r.taskDir, r.alloc.ID) + ctx := driver.NewExecContext(r.taskDir, r.alloc.ID, r.config.LogLevel) if err := drv.Prestart(ctx, r.task); err != nil { wrapped := fmt.Errorf("failed to initialize task %q for alloc %q: %v", r.task.Name, r.alloc.ID, err) diff --git a/command/agent/agent.go b/command/agent/agent.go index e684365f5e27..6d482e1f1ecf 100644 --- a/command/agent/agent.go +++ b/command/agent/agent.go @@ -200,6 +200,7 @@ func (a *Agent) clientConfig() (*clientconfig.Config, error) { conf.RPCHandler = a.server } conf.LogOutput = a.logOutput + conf.LogLevel = a.config.LogLevel conf.DevMode = a.config.DevMode if a.config.Region != "" { conf.Region = a.config.Region diff --git a/command/executor_plugin.go b/command/executor_plugin.go index 666cab96150f..24a328534193 100644 --- a/command/executor_plugin.go +++ b/command/executor_plugin.go @@ -25,11 +25,12 @@ func (e *ExecutorPluginCommand) Synopsis() string { } func (e *ExecutorPluginCommand) Run(args []string) int { - if len(args) == 0 { - e.Ui.Error("log output file isn't provided") + if len(args) != 2 { + e.Ui.Error("log output file and log level are not provided") return 1 } logFileName := args[0] + logLevel := args[1] stdo, err := os.OpenFile(logFileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) if err != nil { e.Ui.Error(err.Error()) @@ -37,7 +38,7 @@ func (e *ExecutorPluginCommand) Run(args []string) int { } plugin.Serve(&plugin.ServeConfig{ HandshakeConfig: driver.HandshakeConfig, - Plugins: driver.GetPluginMap(stdo), + Plugins: driver.GetPluginMap(stdo, logLevel), }) return 0 } diff --git a/command/syslog_plugin.go b/command/syslog_plugin.go index 3afbc39a0f12..6b753ac15ce3 100644 --- a/command/syslog_plugin.go +++ b/command/syslog_plugin.go @@ -21,15 +21,16 @@ func (e *SyslogPluginCommand) Help() string { } func (s *SyslogPluginCommand) Synopsis() string { - return "internal - lanch a syslog collector plugin" + return "internal - launch a syslog collector plugin" } func (s *SyslogPluginCommand) Run(args []string) int { - if len(args) == 0 { - s.Ui.Error("log output file isn't provided") + if len(args) == 2 { + s.Ui.Error("log output file and log level are not provided") return 1 } logFileName := args[0] + logLevel := args[1] stdo, err := os.OpenFile(logFileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) if err != nil { s.Ui.Error(err.Error()) @@ -37,7 +38,7 @@ func (s *SyslogPluginCommand) Run(args []string) int { } plugin.Serve(&plugin.ServeConfig{ HandshakeConfig: driver.HandshakeConfig, - Plugins: driver.GetPluginMap(stdo), + Plugins: driver.GetPluginMap(stdo, logLevel), }) return 0