5 Commits

Author SHA1 Message Date
a445a51c0d Adding GetDebug method to loggers. 2022-09-07 06:03:28 -04:00
a2a849600b Add docs for NullLogger. 2022-09-06 01:01:39 -04:00
94145fb4c7 Add NullLogger to MultiLogger. 2022-03-13 13:34:24 -04:00
81a2d308f0 Add NullLogger.
For when you need a Logger but don't want one. ;)
2022-03-13 13:29:31 -04:00
c4b3c6441a adding Bytes() to MaskBit 2022-02-01 18:27:45 -05:00
11 changed files with 303 additions and 94 deletions

View File

@@ -1,5 +1,12 @@
package bitmask
import (
"bytes"
"errors"
"encoding/binary"
"math/bits"
)
// MaskBit is a flag container.
type MaskBit uint
@@ -62,6 +69,46 @@ func (m *MaskBit) ToggleFlag(flag MaskBit) {
return
}
/*
Bytes returns the current value of a MasBit as a byte slice (big-endian).
If trim is false, b will (probably) be 4 bytes long if you're on a 32-bit size system,
and b will (probably) be 8 bytes long if you're on a 64-bit size system. You can determine
the size of the resulting slice via (math/)bits.UintSize / 8.
If trim is true, it will trim leading null bytes (if any). This will lead to an unpredictable
byte slice length in b, but is most likely preferred for byte operations.
*/
func (m *MaskBit) Bytes(trim bool) (b []byte) {
var b2 []byte
var size int = bits.UintSize / 8
var err error
b2 = make([]byte, size)
switch s := bits.UintSize; s {
case 32:
binary.BigEndian.PutUint32(b2[:], uint32(*m))
case 64:
binary.BigEndian.PutUint64(b2[:], uint64(*m))
default:
err = errors.New("unsupported Uint/system bit size")
panic(err)
}
if trim {
b = bytes.TrimLeft(b2, "\x00")
return
} else {
b = b2
return
}
return
}
// Value returns the current raw uint value of a MaskBit.
func (m *MaskBit) Value() (v uint) {

View File

@@ -3,18 +3,19 @@ Package logging implements and presents various loggers under a unified interfac
These particular loggers (logging.Logger) available are:
NullLogger
StdLogger
FileLogger
SystemDLogger (Linux only)
SyslogLogger (Linux only)
WinLogger (Windows only)
There is a sixth type of logging.Logger, MultiLogger, that allows for multiple loggers to be written to with a single call.
There is a seventh type of logging.Logger, MultiLogger, that allows for multiple loggers to be written to with a single call.
As you may have guessed, NullLogger doesn't actually log anything but is fully "functional" as a logging.Logger.
Note that for some Loggers, the prefix may be modified - "literal" loggers (StdLogger and FileLogger) will append a space to the end of the prefix.
If this is undesired (unlikely), you will need to modify (Logger).Prefix and run (Logger).Logger.SetPrefix(yourPrefixHere) for the respective logger.
Every logging.Logger type has the following methods that correspond to certain "levels".
Alert(s string, v ...interface{}) (err error)
@@ -36,6 +37,7 @@ Note that in the case of a MultiLogger, err (if not nil) will be a (r00t2.io/gou
logging.Logger types also have the following methods:
DoDebug(d bool) (err error)
GetDebug() (d bool)
SetPrefix(p string) (err error)
GetPrefix() (p string, err error)
Setup() (err error)

View File

@@ -1,12 +1,12 @@
package logging
import (
`errors`
"errors"
"fmt"
`io/fs`
"io/fs"
"log"
"os"
`strings`
"strings"
)
// Setup sets up/configures a FileLogger and prepares it for use.
@@ -65,6 +65,14 @@ func (l *FileLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this FileLogger.
func (l *FileLogger) GetDebug() (d bool) {
d = l.EnableDebug
return
}
/*
SetPrefix sets the prefix for this FileLogger.
err will always be nil; it's there for interface-compat.

View File

@@ -1,11 +1,11 @@
package logging
import (
`errors`
`fmt`
`sync`
"errors"
"fmt"
"sync"
`r00t2.io/goutils/multierr`
"r00t2.io/goutils/multierr"
)
// Setup sets up/configures a MultiLogger (and all its MultiLogger.Loggers) and prepares it for use.
@@ -114,6 +114,14 @@ func (m *MultiLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this MultiLogger.
func (m *MultiLogger) GetDebug() (d bool) {
d = m.EnableDebug
return
}
/*
SetPrefix sets the prefix for this MultiLogger (and all its MultiLogger.Loggers).

View File

@@ -1,10 +1,10 @@
package logging
import (
`path`
"path"
`github.com/google/uuid`
`r00t2.io/sysutils/paths`
"github.com/google/uuid"
"r00t2.io/sysutils/paths"
)
/*
@@ -145,6 +145,40 @@ func (m *MultiLogger) AddFileLogger(identifier string, logFlags int, logfilePath
return
}
/*
AddNullLogger adds a NullLogger to a MultiLogger.
identifier is a string to use to identify the added NullLogger in MultiLogger.Loggers.
If empty, one will be automatically generated.
*/
func (m *MultiLogger) AddNullLogger(identifier string) (err error) {
var exists bool
var prefix string
if identifier == "" {
identifier = uuid.New().String()
}
if _, exists = m.Loggers[identifier]; exists {
err = ErrExistingLogger
return
}
m.Loggers[identifier] = &NullLogger{}
if err = m.Loggers[identifier].Setup(); err != nil {
return
}
if prefix, err = m.Loggers[identifier].GetPrefix(); err != nil {
return
}
m.Loggers[identifier].Debug("logger initialized of type %T with prefix %v", m.Loggers[identifier], prefix)
return
}
// RemoveLogger will let you remove a Logger from MultiLogger.Loggers.
func (m *MultiLogger) RemoveLogger(identifier string) (err error) {

View File

@@ -0,0 +1,74 @@
package logging
// Setup does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Setup() (err error) {
return
}
// DoDebug does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this NullLogger. It will always return true. 🙃
func (n *NullLogger) GetDebug() (d bool) {
d = true
return
}
// SetPrefix does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) SetPrefix(p string) (err error) {
return
}
// GetPrefix does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) GetPrefix() (p string, err error) {
return
}
// Shutdown does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Shutdown() (err error) {
return
}
// Alert does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Alert(s string, v ...interface{}) (err error) {
return
}
// Crit does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Crit(s string, v ...interface{}) (err error) {
return
}
// Debug does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Debug(s string, v ...interface{}) (err error) {
return
}
// Emerg does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Emerg(s string, v ...interface{}) (err error) {
return
}
// Err does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Err(s string, v ...interface{}) (err error) {
return
}
// Info does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Info(s string, v ...interface{}) (err error) {
return
}
// Notice does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Notice(s string, v ...interface{}) (err error) {
return
}
// Warning does nothing at all; it's here for interface compat. 🙃
func (l *NullLogger) Warning(s string, v ...interface{}) (err error) {
return
}

View File

@@ -2,10 +2,10 @@ package logging
import (
"fmt"
`io`
`log`
`os`
`strings`
"io"
"log"
"os"
"strings"
)
/*
@@ -80,6 +80,14 @@ func (l *StdLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this StdLogger.
func (l *StdLogger) GetDebug() (d bool) {
d = l.EnableDebug
return
}
/*
SetPrefix sets the prefix for this StdLogger.
err will always be nil; it's there for interface-compat.

View File

@@ -52,6 +52,14 @@ func (l *SystemDLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this SystemDLogger.
func (l *SystemDLogger) GetDebug() (d bool) {
d = l.EnableDebug
return
}
/*
SetPrefix sets the prefix for this SystemDLogger.
err will always be nil; it's there for interface-compat.

View File

@@ -5,7 +5,7 @@ import (
"log"
"log/syslog"
`r00t2.io/goutils/multierr`
"r00t2.io/goutils/multierr"
)
// Setup sets up/configures a SyslogLogger and prepares it for use.
@@ -95,6 +95,14 @@ func (l *SyslogLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this SyslogLogger.
func (l *SyslogLogger) GetDebug() (d bool) {
d = l.EnableDebug
return
}
// SetPrefix sets the prefix for this SyslogLogger.
func (l *SyslogLogger) SetPrefix(prefix string) (err error) {

View File

@@ -1,15 +1,15 @@
package logging
import (
`errors`
`fmt`
`os`
`os/exec`
`syscall`
"errors"
"fmt"
"os"
"os/exec"
"syscall"
`golang.org/x/sys/windows/registry`
`golang.org/x/sys/windows/svc/eventlog`
`r00t2.io/sysutils/paths`
"golang.org/x/sys/windows/registry"
"golang.org/x/sys/windows/svc/eventlog"
"r00t2.io/sysutils/paths"
)
/*
@@ -150,6 +150,14 @@ func (l *WinLogger) DoDebug(d bool) (err error) {
return
}
// GetDebug returns the debug status of this WinLogger.
func (l *WinLogger) GetDebug() (d bool) {
d = l.EnableDebug
return
}
// SetPrefix sets the prefix for this WinLogger.
func (l *WinLogger) SetPrefix(prefix string) (err error) {

View File

@@ -2,7 +2,7 @@ package logging
import (
"log"
`os`
"os"
)
/*
@@ -18,6 +18,7 @@ type Logger interface {
Notice(s string, v ...interface{}) (err error)
Warning(s string, v ...interface{}) (err error)
DoDebug(d bool) (err error)
GetDebug() (d bool)
SetPrefix(p string) (err error)
GetPrefix() (p string, err error)
Setup() (err error)
@@ -86,6 +87,9 @@ type FileLogger struct {
writer *os.File
}
// NullLogger is used mainly for test implementations, mockup code, etc. It does absolutely nothing with all messages sent to it.
type NullLogger struct{}
// MultiLogger is used to contain one or more Loggers and present them all as a single Logger.
type MultiLogger struct {
/*