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

@@ -1,61 +1,96 @@
package logging
import (
`errors`
"fmt"
"io"
`io/fs`
"log"
"os"
`strings`
)
// Setup sets up/configures a FileLogger and prepares it for use.
func (l *FileLogger) Setup() {
func (l *FileLogger) Setup() (err error) {
var err error
var multi io.Writer
l.Logger = log.Default()
l.Logger.SetPrefix(l.Prefix + " ")
if l.writer, err = os.OpenFile(l.Path, appendFlags, logPerm); err != nil {
log.Panicf("could not open log file \"%v\" for writing: %v\n", l.Path, err)
// This uses a shared handle across the import. We don't want that.
// l.Logger = log.Default()
if l.Prefix != "" {
l.Prefix = strings.TrimRight(l.Prefix, " ") + " "
// l.Logger.SetPrefix(l.Prefix)
}
if l.writer, err = os.OpenFile(l.Path, appendFlags, logPerm); err != nil {
return
}
// https://stackoverflow.com/a/36719588/733214
if l.EnableStdOut {
switch {
case l.EnableStdErr && l.EnableStdOut:
multi = io.MultiWriter(os.Stdout, os.Stderr, l.writer)
case l.EnableStdErr:
multi = io.MultiWriter(os.Stderr, l.writer)
case l.EnableStdOut:
multi = io.MultiWriter(os.Stdout, l.writer)
} else {
default:
multi = l.writer
}
l.Logger.SetOutput(multi)
l.Logger = log.New(multi, l.Prefix, l.LogFlags)
// l.Logger.SetOutput(multi)
return
}
// Shutdown cleanly shuts down a FileLogger.
func (l *FileLogger) Shutdown() {
var err error
func (l *FileLogger) Shutdown() (err error) {
if err = l.writer.Close(); err != nil {
log.Panicf("could not close log file \"%v\": %v\n", l.Path, err)
if !errors.Is(err, fs.ErrClosed) {
return
}
}
return
}
// GetPrefix returns the prefix used by this FileLogger.
func (l *FileLogger) GetPrefix() string {
return l.Prefix
/*
GetPrefix returns the prefix used by this FileLogger.
err will always be nil; it's there for interface-compat.
*/
func (l *FileLogger) GetPrefix() (prefix string, err error) {
prefix = l.Prefix
return
}
/*
DoDebug sets the debug state of this FileLogger.
Note that this merely acts as a *safety filter* for debug messages to avoid sensitive information being written to the log.
err will always be nil; it's there for interface-compat.
*/
func (l *FileLogger) DoDebug(d bool) {
func (l *FileLogger) DoDebug(d bool) (err error) {
l.EnableDebug = d
return
}
// SetPrefix sets the prefix for this FileLogger.
func (l *FileLogger) SetPrefix(prefix string) {
/*
SetPrefix sets the prefix for this FileLogger.
err will always be nil; it's there for interface-compat.
*/
func (l *FileLogger) SetPrefix(prefix string) (err error) {
l.Prefix = prefix + " "
l.Logger.SetPrefix(prefix + " ")
l.Prefix = prefix
if prefix != "" {
l.Prefix = strings.TrimRight(l.Prefix, " ") + " "
}
l.Logger.SetPrefix(l.Prefix)
return
}
// Alert writes an ALERT-level message to this FileLogger.