Windows Event Log, error output

Adding more Event Log support, and modifying the loggers so they return
errors in their operational functions.
This commit is contained in:
2022-01-16 02:05:42 -05:00
parent 3d0d420454
commit 39e0a1fd43
18 changed files with 612 additions and 220 deletions

View File

@@ -7,41 +7,70 @@ import (
)
// Setup sets up/configures a MultiLogger (and all its MultiLogger.Loggers) and prepares it for use.
func (m *MultiLogger) Setup() {
func (m *MultiLogger) Setup() (err error) {
var wg sync.WaitGroup
var errs *multierr.MultiError = multierr.NewMultiError(nil)
for _, l := range m.Loggers {
wg.Add(1)
go func() {
var err2 error
defer wg.Done()
l.Setup()
if err2 = l.Setup(); err2 != nil {
errs.AddError(err2)
err2 = nil
}
}()
}
wg.Wait()
if errs.Count() > 0 {
err = errs
return
}
return
}
// Shutdown cleanly shuts down a MultiLogger (and all its MultiLogger.Loggers).
func (m *MultiLogger) Shutdown() {
func (m *MultiLogger) Shutdown() (err error) {
var wg sync.WaitGroup
var errs *multierr.MultiError = multierr.NewMultiError(nil)
for _, l := range m.Loggers {
wg.Add(1)
go func() {
var err2 error
defer wg.Done()
l.Shutdown()
if err2 = l.Shutdown(); err2 != nil {
errs.AddError(err2)
err2 = nil
}
}()
}
wg.Wait()
if errs.Count() > 0 {
err = errs
return
}
return
}
// GetPrefix returns the prefix used by this MultiLogger (and all its MultiLogger.Loggers).
func (m *MultiLogger) GetPrefix() string {
/*
GetPrefix returns the prefix used by this MultiLogger (and all its MultiLogger.Loggers).
err will always be nil; it's there for interface-compat.
*/
func (m *MultiLogger) GetPrefix() (prefix string, err error) {
return m.Prefix
prefix = m.Prefix
return
}
@@ -51,21 +80,33 @@ func (m *MultiLogger) GetPrefix() string {
If you had a logger-specific EnableDebug set, you will need to re-set it to your desired state after running this method.
*/
func (m *MultiLogger) DoDebug(d bool) {
func (m *MultiLogger) DoDebug(d bool) (err error) {
var wg sync.WaitGroup
var errs *multierr.MultiError = multierr.NewMultiError(nil)
m.EnableDebug = d
for _, l := range m.Loggers {
wg.Add(1)
go func() {
var err2 error
defer wg.Done()
l.DoDebug(d)
if err2 = l.DoDebug(d); err2 != nil {
errs.AddError(err2)
err2 = nil
}
}()
}
wg.Wait()
if errs.Count() > 0 {
err = errs
return
}
return
}
/*
@@ -73,21 +114,33 @@ func (m *MultiLogger) DoDebug(d bool) {
If you had a logger-specific Prefix set, you will need to re-set it to your desired prefix after running this method.
*/
func (m *MultiLogger) SetPrefix(prefix string) {
func (m *MultiLogger) SetPrefix(prefix string) (err error) {
var wg sync.WaitGroup
var errs *multierr.MultiError = multierr.NewMultiError(nil)
m.Prefix = prefix
for _, l := range m.Loggers {
wg.Add(1)
go func() {
var err2 error
defer wg.Done()
l.SetPrefix(prefix)
if err2 = l.SetPrefix(prefix); err != nil {
errs.AddError(err2)
err2 = nil
}
}()
}
wg.Wait()
if errs.Count() > 0 {
err = errs
return
}
return
}
// Alert writes an ALERT-level message to this MultiLogger (and all its MultiLogger.Loggers).
@@ -100,16 +153,11 @@ func (m *MultiLogger) Alert(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Alert(msg, rplc...)
} else {
err = logObj.Alert(msg)
}
if err != nil {
if err = logObj.Alert(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -131,16 +179,11 @@ func (m *MultiLogger) Crit(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Crit(msg, rplc...)
} else {
err = logObj.Crit(msg)
}
if err != nil {
if err = logObj.Crit(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -162,16 +205,11 @@ func (m *MultiLogger) Debug(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Debug(msg, rplc...)
} else {
err = logObj.Debug(msg)
}
if err != nil {
if err = logObj.Debug(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -192,16 +230,11 @@ func (m *MultiLogger) Emerg(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Emerg(msg, rplc...)
} else {
err = logObj.Emerg(msg)
}
if err != nil {
if err = logObj.Emerg(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -222,16 +255,11 @@ func (m *MultiLogger) Err(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Err(msg, rplc...)
} else {
err = logObj.Err(msg)
}
if err != nil {
if err = logObj.Err(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -253,16 +281,11 @@ func (m *MultiLogger) Info(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Info(msg, rplc...)
} else {
err = logObj.Info(msg)
}
if err != nil {
if err = logObj.Info(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -284,16 +307,11 @@ func (m *MultiLogger) Notice(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Notice(msg, rplc...)
} else {
err = logObj.Notice(msg)
}
if err != nil {
if err = logObj.Notice(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()
@@ -315,16 +333,11 @@ func (m *MultiLogger) Warning(s string, v ...interface{}) (err error) {
wg.Add(1)
go func(logObj Logger, msg string, rplc ...interface{}) {
defer wg.Done()
if rplc != nil {
err = logObj.Warning(msg, rplc...)
} else {
err = logObj.Warning(msg)
}
if err != nil {
if err = logObj.Warning(msg, rplc...); err != nil {
e.AddError(err)
err = nil
}
}(l, s, v)
}(l, s, v...)
}
wg.Wait()