From d495b3640ead743b11eb5d22d3133fe0f6aaba84 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Mon, 12 Mar 2018 16:27:57 +0000 Subject: [PATCH] Add extra fields to runmqserver JSON log --- cmd/runmqdevserver/main.go | 18 +++++++++++++++--- cmd/runmqserver/logging.go | 18 ++++++++++++++---- cmd/runmqserver/main.go | 12 ++++++------ cmd/runmqserver/main_test.go | 2 +- internal/logger/logger.go | 23 +++++++++++++++++++++-- internal/logger/logger_test.go | 12 +++++++++--- 6 files changed, 66 insertions(+), 19 deletions(-) diff --git a/cmd/runmqdevserver/main.go b/cmd/runmqdevserver/main.go index d1607aa..28189b3 100644 --- a/cmd/runmqdevserver/main.go +++ b/cmd/runmqdevserver/main.go @@ -24,6 +24,7 @@ import ( "github.com/ibm-messaging/mq-container/internal/command" "github.com/ibm-messaging/mq-container/internal/logger" + "github.com/ibm-messaging/mq-container/internal/name" ) var log *logger.Logger @@ -57,15 +58,26 @@ func getDebug() bool { } func configureLogger() error { + var err error f := getLogFormat() d := getDebug() + n, err := name.GetQueueManagerName() + if err != nil { + return err + } switch f { case "json": - log = logger.NewLogger(os.Stderr, d, true) + log, err = logger.NewLogger(os.Stderr, d, true, n) + if err != nil { + return err + } case "basic": - log = logger.NewLogger(os.Stderr, d, false) + log, err = logger.NewLogger(os.Stderr, d, false, n) + if err != nil { + return err + } default: - log = logger.NewLogger(os.Stdout, d, false) + log, err = logger.NewLogger(os.Stdout, d, false, n) return fmt.Errorf("invalid value for LOG_FORMAT: %v", f) } return nil diff --git a/cmd/runmqserver/logging.go b/cmd/runmqserver/logging.go index a50b1e7..9538ab9 100644 --- a/cmd/runmqserver/logging.go +++ b/cmd/runmqserver/logging.go @@ -89,15 +89,22 @@ func getDebug() bool { return false } -func configureLogger() (mirrorFunc, error) { +func configureLogger(name string) (mirrorFunc, error) { + var err error f := getLogFormat() d := getDebug() switch f { case "json": - log = logger.NewLogger(os.Stderr, d, true) + log, err = logger.NewLogger(os.Stderr, d, true, name) + if err != nil { + return nil, err + } return log.LogDirect, nil case "basic": - log = logger.NewLogger(os.Stderr, d, false) + log, err = logger.NewLogger(os.Stderr, d, false, name) + if err != nil { + return nil, err + } return func(msg string) { // Parse the JSON message, and print a simplified version var obj map[string]interface{} @@ -105,7 +112,10 @@ func configureLogger() (mirrorFunc, error) { fmt.Printf(formatSimple(obj["ibm_datetime"].(string), obj["message"].(string))) }, nil default: - log = logger.NewLogger(os.Stdout, d, false) + log, err = logger.NewLogger(os.Stdout, d, false, name) + if err != nil { + return nil, err + } return nil, fmt.Errorf("invalid value for LOG_FORMAT: %v", f) } } diff --git a/cmd/runmqserver/main.go b/cmd/runmqserver/main.go index 59ec0e2..af1baff 100644 --- a/cmd/runmqserver/main.go +++ b/cmd/runmqserver/main.go @@ -28,21 +28,21 @@ import ( ) func doMain() error { - mf, err := configureLogger() + name, nameErr := name.GetQueueManagerName() + mf, err := configureLogger(name) if err != nil { logTermination(err) return err } + if nameErr != nil { + logTermination(err) + return err + } err = ready.Clear() if err != nil { logTermination(err) return err } - name, err := name.GetQueueManagerName() - if err != nil { - logTermination(err) - return err - } accepted, err := checkLicense() if err != nil { logTerminationf("Error checking license acceptance: %v", err) diff --git a/cmd/runmqserver/main_test.go b/cmd/runmqserver/main_test.go index fe60e70..ed4d552 100644 --- a/cmd/runmqserver/main_test.go +++ b/cmd/runmqserver/main_test.go @@ -31,7 +31,7 @@ const filename = "/var/coverage/exitCode" func init() { test = flag.Bool("test", false, "Set to true when running tests for coverage") - log = logger.NewLogger(os.Stdout, true, false) + log, _ = logger.NewLogger(os.Stdout, true, false, "test") } // Test started when the test binary is started. Only calls main. diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 2aa5f32..f0a8ed1 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "os" + "os/user" "sync" "time" ) @@ -39,10 +40,21 @@ type Logger struct { json bool processName string pid int + serverName string + host string + user *user.User } // NewLogger creates a new logger -func NewLogger(writer io.Writer, debug bool, json bool) *Logger { +func NewLogger(writer io.Writer, debug bool, json bool, serverName string) (*Logger, error) { + hostname, err := os.Hostname() + if err != nil { + return nil, err + } + user, err := user.Current() + if err != nil { + return nil, err + } return &Logger{ mutex: sync.Mutex{}, writer: writer, @@ -50,7 +62,10 @@ func NewLogger(writer io.Writer, debug bool, json bool) *Logger { json: json, processName: os.Args[0], pid: os.Getpid(), - } + serverName: serverName, + host: hostname, + user: user, + }, nil } func (l *Logger) format(entry map[string]interface{}) (string, error) { @@ -72,8 +87,12 @@ func (l *Logger) log(level string, msg string) { "message": fmt.Sprint(msg), "ibm_datetime": t.Format(timestampFormat), "loglevel": level, + "host": l.host, + "ibm_serverName": l.serverName, "ibm_processName": l.processName, "ibm_processId": l.pid, + "ibm_userName": l.user.Username, + "type": "mq_log", } s, err := l.format(entry) l.mutex.Lock() diff --git a/internal/logger/logger_test.go b/internal/logger/logger_test.go index cf5fde3..49d8e99 100644 --- a/internal/logger/logger_test.go +++ b/internal/logger/logger_test.go @@ -25,11 +25,14 @@ import ( func TestJSONLogger(t *testing.T) { buf := new(bytes.Buffer) - l := NewLogger(buf, true, true) + l, err := NewLogger(buf, true, true, t.Name()) + if err != nil { + t.Fatal(err) + } s := "Hello world" l.Print(s) var e map[string]interface{} - err := json.Unmarshal([]byte(buf.String()), &e) + err = json.Unmarshal([]byte(buf.String()), &e) if err != nil { t.Error(err) } @@ -40,7 +43,10 @@ func TestJSONLogger(t *testing.T) { func TestSimpleLogger(t *testing.T) { buf := new(bytes.Buffer) - l := NewLogger(buf, true, false) + l, err := NewLogger(buf, true, false, t.Name()) + if err != nil { + t.Fatal(err) + } s := "Hello world" l.Print(s) if !strings.Contains(buf.String(), s) {