github.com/nats-io/nats-server/v2@v2.11.0-preview.2/logger/syslog_windows.go (about) 1 // Copyright 2012-2018 The NATS Authors 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 // Package logger logs to the windows event log 15 package logger 16 17 import ( 18 "fmt" 19 "os" 20 "strings" 21 22 "golang.org/x/sys/windows/svc/eventlog" 23 ) 24 25 var natsEventSource = "NATS-Server" 26 27 // SetSyslogName sets the name to use for the system log event source 28 func SetSyslogName(name string) { 29 natsEventSource = name 30 } 31 32 // SysLogger logs to the windows event logger 33 type SysLogger struct { 34 writer *eventlog.Log 35 debug bool 36 trace bool 37 } 38 39 // NewSysLogger creates a log using the windows event logger 40 func NewSysLogger(debug, trace bool) *SysLogger { 41 if err := eventlog.InstallAsEventCreate(natsEventSource, eventlog.Info|eventlog.Error|eventlog.Warning); err != nil { 42 if !strings.Contains(err.Error(), "registry key already exists") { 43 panic(fmt.Sprintf("could not access event log: %v", err)) 44 } 45 } 46 47 w, err := eventlog.Open(natsEventSource) 48 if err != nil { 49 panic(fmt.Sprintf("could not open event log: %v", err)) 50 } 51 52 return &SysLogger{ 53 writer: w, 54 debug: debug, 55 trace: trace, 56 } 57 } 58 59 // NewRemoteSysLogger creates a remote event logger 60 func NewRemoteSysLogger(fqn string, debug, trace bool) *SysLogger { 61 w, err := eventlog.OpenRemote(fqn, natsEventSource) 62 if err != nil { 63 panic(fmt.Sprintf("could not open event log: %v", err)) 64 } 65 66 return &SysLogger{ 67 writer: w, 68 debug: debug, 69 trace: trace, 70 } 71 } 72 73 func formatMsg(tag, format string, v ...any) string { 74 orig := fmt.Sprintf(format, v...) 75 return fmt.Sprintf("pid[%d][%s]: %s", os.Getpid(), tag, orig) 76 } 77 78 // Noticef logs a notice statement 79 func (l *SysLogger) Noticef(format string, v ...any) { 80 l.writer.Info(1, formatMsg("NOTICE", format, v...)) 81 } 82 83 // Warnf logs a warning statement 84 func (l *SysLogger) Warnf(format string, v ...any) { 85 l.writer.Info(1, formatMsg("WARN", format, v...)) 86 } 87 88 // Fatalf logs a fatal error 89 func (l *SysLogger) Fatalf(format string, v ...any) { 90 msg := formatMsg("FATAL", format, v...) 91 l.writer.Error(5, msg) 92 panic(msg) 93 } 94 95 // Errorf logs an error statement 96 func (l *SysLogger) Errorf(format string, v ...any) { 97 l.writer.Error(2, formatMsg("ERROR", format, v...)) 98 } 99 100 // Debugf logs a debug statement 101 func (l *SysLogger) Debugf(format string, v ...any) { 102 if l.debug { 103 l.writer.Info(3, formatMsg("DEBUG", format, v...)) 104 } 105 } 106 107 // Tracef logs a trace statement 108 func (l *SysLogger) Tracef(format string, v ...any) { 109 if l.trace { 110 l.writer.Info(4, formatMsg("TRACE", format, v...)) 111 } 112 }