Add extra fields to runmqserver JSON log
This commit is contained in:
@@ -24,6 +24,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ibm-messaging/mq-container/internal/command"
|
"github.com/ibm-messaging/mq-container/internal/command"
|
||||||
"github.com/ibm-messaging/mq-container/internal/logger"
|
"github.com/ibm-messaging/mq-container/internal/logger"
|
||||||
|
"github.com/ibm-messaging/mq-container/internal/name"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log *logger.Logger
|
var log *logger.Logger
|
||||||
@@ -57,15 +58,26 @@ func getDebug() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func configureLogger() error {
|
func configureLogger() error {
|
||||||
|
var err error
|
||||||
f := getLogFormat()
|
f := getLogFormat()
|
||||||
d := getDebug()
|
d := getDebug()
|
||||||
|
n, err := name.GetQueueManagerName()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
switch f {
|
switch f {
|
||||||
case "json":
|
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":
|
case "basic":
|
||||||
log = logger.NewLogger(os.Stderr, d, false)
|
log, err = logger.NewLogger(os.Stderr, d, false, n)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
default:
|
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 fmt.Errorf("invalid value for LOG_FORMAT: %v", f)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -89,15 +89,22 @@ func getDebug() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureLogger() (mirrorFunc, error) {
|
func configureLogger(name string) (mirrorFunc, error) {
|
||||||
|
var err error
|
||||||
f := getLogFormat()
|
f := getLogFormat()
|
||||||
d := getDebug()
|
d := getDebug()
|
||||||
switch f {
|
switch f {
|
||||||
case "json":
|
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
|
return log.LogDirect, nil
|
||||||
case "basic":
|
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) {
|
return func(msg string) {
|
||||||
// Parse the JSON message, and print a simplified version
|
// Parse the JSON message, and print a simplified version
|
||||||
var obj map[string]interface{}
|
var obj map[string]interface{}
|
||||||
@@ -105,7 +112,10 @@ func configureLogger() (mirrorFunc, error) {
|
|||||||
fmt.Printf(formatSimple(obj["ibm_datetime"].(string), obj["message"].(string)))
|
fmt.Printf(formatSimple(obj["ibm_datetime"].(string), obj["message"].(string)))
|
||||||
}, nil
|
}, nil
|
||||||
default:
|
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)
|
return nil, fmt.Errorf("invalid value for LOG_FORMAT: %v", f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,21 +28,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func doMain() error {
|
func doMain() error {
|
||||||
mf, err := configureLogger()
|
name, nameErr := name.GetQueueManagerName()
|
||||||
|
mf, err := configureLogger(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logTermination(err)
|
logTermination(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if nameErr != nil {
|
||||||
|
logTermination(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
err = ready.Clear()
|
err = ready.Clear()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logTermination(err)
|
logTermination(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
name, err := name.GetQueueManagerName()
|
|
||||||
if err != nil {
|
|
||||||
logTermination(err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
accepted, err := checkLicense()
|
accepted, err := checkLicense()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logTerminationf("Error checking license acceptance: %v", err)
|
logTerminationf("Error checking license acceptance: %v", err)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const filename = "/var/coverage/exitCode"
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
test = flag.Bool("test", false, "Set to true when running tests for coverage")
|
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.
|
// Test started when the test binary is started. Only calls main.
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"os/user"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -39,10 +40,21 @@ type Logger struct {
|
|||||||
json bool
|
json bool
|
||||||
processName string
|
processName string
|
||||||
pid int
|
pid int
|
||||||
|
serverName string
|
||||||
|
host string
|
||||||
|
user *user.User
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLogger creates a new logger
|
// 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{
|
return &Logger{
|
||||||
mutex: sync.Mutex{},
|
mutex: sync.Mutex{},
|
||||||
writer: writer,
|
writer: writer,
|
||||||
@@ -50,7 +62,10 @@ func NewLogger(writer io.Writer, debug bool, json bool) *Logger {
|
|||||||
json: json,
|
json: json,
|
||||||
processName: os.Args[0],
|
processName: os.Args[0],
|
||||||
pid: os.Getpid(),
|
pid: os.Getpid(),
|
||||||
}
|
serverName: serverName,
|
||||||
|
host: hostname,
|
||||||
|
user: user,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) format(entry map[string]interface{}) (string, error) {
|
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),
|
"message": fmt.Sprint(msg),
|
||||||
"ibm_datetime": t.Format(timestampFormat),
|
"ibm_datetime": t.Format(timestampFormat),
|
||||||
"loglevel": level,
|
"loglevel": level,
|
||||||
|
"host": l.host,
|
||||||
|
"ibm_serverName": l.serverName,
|
||||||
"ibm_processName": l.processName,
|
"ibm_processName": l.processName,
|
||||||
"ibm_processId": l.pid,
|
"ibm_processId": l.pid,
|
||||||
|
"ibm_userName": l.user.Username,
|
||||||
|
"type": "mq_log",
|
||||||
}
|
}
|
||||||
s, err := l.format(entry)
|
s, err := l.format(entry)
|
||||||
l.mutex.Lock()
|
l.mutex.Lock()
|
||||||
|
|||||||
@@ -25,11 +25,14 @@ import (
|
|||||||
|
|
||||||
func TestJSONLogger(t *testing.T) {
|
func TestJSONLogger(t *testing.T) {
|
||||||
buf := new(bytes.Buffer)
|
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"
|
s := "Hello world"
|
||||||
l.Print(s)
|
l.Print(s)
|
||||||
var e map[string]interface{}
|
var e map[string]interface{}
|
||||||
err := json.Unmarshal([]byte(buf.String()), &e)
|
err = json.Unmarshal([]byte(buf.String()), &e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
@@ -40,7 +43,10 @@ func TestJSONLogger(t *testing.T) {
|
|||||||
|
|
||||||
func TestSimpleLogger(t *testing.T) {
|
func TestSimpleLogger(t *testing.T) {
|
||||||
buf := new(bytes.Buffer)
|
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"
|
s := "Hello world"
|
||||||
l.Print(s)
|
l.Print(s)
|
||||||
if !strings.Contains(buf.String(), s) {
|
if !strings.Contains(buf.String(), s) {
|
||||||
|
|||||||
Reference in New Issue
Block a user