mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-15 10:40:41 -07:00
The use of the `svc` API prevented the NATS Server to run as a container on both nanoserver and windowsservercore Docker images. An attempt was made to replace svc.Debug with normal server.Start() if detected to be interactive, however, that did not work. The fact of detecting if interactive or not already requires connecting to the service controller apparently. This change looks up for an environment variable (NATS_DOCKERIZED) and if set to "1", will not make use of the `svc` package. This environment variable will be set in the Docker image (in nats-docker/windows/nanoserver/Dockerfile and windowsservercore/Dockerfile). Resolves #543
94 lines
2.2 KiB
Go
94 lines
2.2 KiB
Go
// Copyright 2012-2016 Apcera Inc. All rights reserved.
|
|
|
|
// Package logger logs to the windows event log
|
|
package logger
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"golang.org/x/sys/windows/svc/eventlog"
|
|
)
|
|
|
|
const (
|
|
natsEventSource = "NATS-Server"
|
|
)
|
|
|
|
// SysLogger logs to the windows event logger
|
|
type SysLogger struct {
|
|
writer *eventlog.Log
|
|
debug bool
|
|
trace bool
|
|
}
|
|
|
|
// NewSysLogger creates a log using the windows event logger
|
|
func NewSysLogger(debug, trace bool) *SysLogger {
|
|
if err := eventlog.InstallAsEventCreate(natsEventSource, eventlog.Info|eventlog.Error|eventlog.Warning); err != nil {
|
|
if !strings.Contains(err.Error(), "registry key already exists") {
|
|
panic(fmt.Sprintf("could not access event log: %v", err))
|
|
}
|
|
}
|
|
|
|
w, err := eventlog.Open(natsEventSource)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("could not open event log: %v", err))
|
|
}
|
|
|
|
return &SysLogger{
|
|
writer: w,
|
|
debug: debug,
|
|
trace: trace,
|
|
}
|
|
}
|
|
|
|
// NewRemoteSysLogger creates a remote event logger
|
|
func NewRemoteSysLogger(fqn string, debug, trace bool) *SysLogger {
|
|
w, err := eventlog.OpenRemote(fqn, natsEventSource)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("could not open event log: %v", err))
|
|
}
|
|
|
|
return &SysLogger{
|
|
writer: w,
|
|
debug: debug,
|
|
trace: trace,
|
|
}
|
|
}
|
|
|
|
func formatMsg(tag, format string, v ...interface{}) string {
|
|
orig := fmt.Sprintf(format, v...)
|
|
return fmt.Sprintf("pid[%d][%s]: %s", os.Getpid(), tag, orig)
|
|
}
|
|
|
|
// Noticef logs a notice statement
|
|
func (l *SysLogger) Noticef(format string, v ...interface{}) {
|
|
l.writer.Info(1, formatMsg("NOTICE", format, v...))
|
|
}
|
|
|
|
// Fatalf logs a fatal error
|
|
func (l *SysLogger) Fatalf(format string, v ...interface{}) {
|
|
msg := formatMsg("FATAL", format, v...)
|
|
l.writer.Error(5, msg)
|
|
panic(msg)
|
|
}
|
|
|
|
// Errorf logs an error statement
|
|
func (l *SysLogger) Errorf(format string, v ...interface{}) {
|
|
l.writer.Error(2, formatMsg("ERROR", format, v...))
|
|
}
|
|
|
|
// Debugf logs a debug statement
|
|
func (l *SysLogger) Debugf(format string, v ...interface{}) {
|
|
if l.debug {
|
|
l.writer.Info(3, formatMsg("DEBUG", format, v...))
|
|
}
|
|
}
|
|
|
|
// Tracef logs a trace statement
|
|
func (l *SysLogger) Tracef(format string, v ...interface{}) {
|
|
if l.trace {
|
|
l.writer.Info(4, formatMsg("TRACE", format, v...))
|
|
}
|
|
}
|