logging
This commit is contained in:
parent
8dea2185fd
commit
d085d0f3ee
8
go.mod
Normal file
8
go.mod
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
module r00t2.io/goutils
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
|
||||||
|
r00t2.io/sysutils v0.0.0-20210224054841-55ac47c86928
|
||||||
|
)
|
5
go.sum
Normal file
5
go.sum
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/jszwec/csvutil v1.5.0/go.mod h1:Rpu7Uu9giO9subDyMCIQfHVDuLrcaC36UA4YcJjGBkg=
|
||||||
|
r00t2.io/sysutils v0.0.0-20210224054841-55ac47c86928 h1:aYEn20eguqsmqT3J9VjkzdhyPwmOVDGzzffcEfV18a4=
|
||||||
|
r00t2.io/sysutils v0.0.0-20210224054841-55ac47c86928/go.mod h1:XzJkBF6SHAODEszJlOcjtGoTHwYnZZNmseA6PyOujes=
|
25
logging/consts.go
Normal file
25
logging/consts.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`os`
|
||||||
|
|
||||||
|
`r00t2.io/goutils/types`
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
devlog string = "/dev/log"
|
||||||
|
logPerm os.FileMode = 0600
|
||||||
|
)
|
||||||
|
|
||||||
|
// Flags for logger configuration
|
||||||
|
const (
|
||||||
|
LogUndefined types.MaskBit = 1 << iota
|
||||||
|
LogJournald
|
||||||
|
LogSyslog
|
||||||
|
LogFile
|
||||||
|
LogStdout
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
defLogPaths = []string{"/var/log/golang/program.log", "~/.local/log/golang/program.log"}
|
||||||
|
)
|
117
logging/funcs.go
Normal file
117
logging/funcs.go
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
native `log`
|
||||||
|
`os`
|
||||||
|
`path`
|
||||||
|
`strings`
|
||||||
|
|
||||||
|
"r00t2.io/goutils/types"
|
||||||
|
|
||||||
|
sysd `github.com/coreos/go-systemd/journal`
|
||||||
|
`r00t2.io/sysutils/paths`
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ = sysd.Enabled()
|
||||||
|
_ = native.Logger{}
|
||||||
|
_ = os.Interrupt
|
||||||
|
_ = types.Env{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetLogger(enableDebug bool, prefix string) (logger Logger, err error) {
|
||||||
|
|
||||||
|
var logPath string
|
||||||
|
var logflags types.MaskBit
|
||||||
|
|
||||||
|
// Configure system-supported logger(s).
|
||||||
|
if sysd.Enabled() {
|
||||||
|
// Use Journald.
|
||||||
|
logflags.AddFlag(LogJournald)
|
||||||
|
} else {
|
||||||
|
// If we can detect syslog, use that. If not, try to use a file logger (+ stdout).
|
||||||
|
// Last ditch, stdout.
|
||||||
|
var hasSyslog bool
|
||||||
|
var stat os.FileInfo
|
||||||
|
var devlogPath string = devlog
|
||||||
|
|
||||||
|
if hasSyslog, stat, err = paths.RealPathExistsStat(&devlogPath); hasSyslog && err != nil {return}
|
||||||
|
|
||||||
|
if hasSyslog && !stat.Mode().IsRegular() {logflags.AddFlag(LogSyslog)} else {
|
||||||
|
var exists bool
|
||||||
|
var success bool
|
||||||
|
logflags.AddFlag(LogStdout)
|
||||||
|
for _, p := range defLogPaths {
|
||||||
|
if exists, _ = paths.RealPathExists(&p); exists {
|
||||||
|
if success, err = testOpen(p); err != nil {
|
||||||
|
continue
|
||||||
|
} else if !success {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
logflags.AddFlag(LogFile)
|
||||||
|
logPath = p
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
dirPath := path.Dir(p)
|
||||||
|
if err = paths.MakeDirIfNotExist(&dirPath); err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if success, err = testOpen(p); err != nil {
|
||||||
|
continue
|
||||||
|
} else if !success {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
logflags.AddFlag(LogFile)
|
||||||
|
logPath = p
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if logflags.HasFlag(LogJournald) {
|
||||||
|
logger = &SystemDLogger{
|
||||||
|
Prefix: logPrefix,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if logflags.HasFlag(LogSyslog) {
|
||||||
|
logger = &SyslogLogger{
|
||||||
|
Prefix: logPrefix,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if logflags.HasFlag(LogFile) {
|
||||||
|
logger = &FileLogger{
|
||||||
|
StdLogger: StdLogger{
|
||||||
|
Prefix: logPrefix,
|
||||||
|
},
|
||||||
|
Path: logPath,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger = &StdLogger{
|
||||||
|
Prefix: logPrefix,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.doDebug(enableDebug)
|
||||||
|
if strings.TrimSpace(prefix) != "" {
|
||||||
|
logger.setPrefix(prefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func testOpen(path string) (success bool, err error) {
|
||||||
|
var f *os.File
|
||||||
|
|
||||||
|
// Example #2, https://golang.org/pkg/os/#OpenFile
|
||||||
|
if f, err = os.OpenFile(path, os.O_RDWR | os.O_CREATE, logPerm); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
success = true
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
41
logging/funcs_file.go
Normal file
41
logging/funcs_file.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
func (l *FileLogger) doDebug(d bool) {
|
||||||
|
l.EnableDebug = d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) setPrefix(prefix string) {
|
||||||
|
l.Prefix = prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
41
logging/funcs_std.go
Normal file
41
logging/funcs_std.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
func (l *StdLogger) doDebug(d bool) {
|
||||||
|
l.EnableDebug = d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) setPrefix(prefix string) {
|
||||||
|
l.Prefix = prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
41
logging/funcs_sysd.go
Normal file
41
logging/funcs_sysd.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
func (l *SystemDLogger) doDebug(d bool) {
|
||||||
|
l.EnableDebug = d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) setPrefix(prefix string) {
|
||||||
|
l.Prefix = prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
41
logging/funcs_syslog.go
Normal file
41
logging/funcs_syslog.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
func (l *SyslogLogger) doDebug(d bool) {
|
||||||
|
l.EnableDebug = d
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) setPrefix(prefix string) {
|
||||||
|
l.Prefix = prefix
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
return
|
||||||
|
}
|
44
logging/types.go
Normal file
44
logging/types.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`log`
|
||||||
|
`log/syslog`
|
||||||
|
)
|
||||||
|
|
||||||
|
type Logger interface {
|
||||||
|
Alert(string, ...interface{}) error
|
||||||
|
Crit(string, ...interface{}) error
|
||||||
|
Debug(string, ...interface{}) error
|
||||||
|
Emerg(string, ...interface{}) error
|
||||||
|
Err(string, ...interface{}) error
|
||||||
|
Info(string, ...interface{}) error
|
||||||
|
Notice(string, ...interface{}) error
|
||||||
|
Warning(string, ...interface{}) error
|
||||||
|
doDebug(bool)
|
||||||
|
setPrefix(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
type SystemDLogger struct {
|
||||||
|
EnableDebug bool
|
||||||
|
Prefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
type SyslogLogger struct {
|
||||||
|
syslog.Writer
|
||||||
|
EnableDebug bool
|
||||||
|
Prefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
type StdLogger struct {
|
||||||
|
log.Logger
|
||||||
|
EnableDebug bool
|
||||||
|
Prefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
type FileLogger struct {
|
||||||
|
log.Logger
|
||||||
|
StdLogger
|
||||||
|
EnableDebug bool
|
||||||
|
Path string
|
||||||
|
Prefix string
|
||||||
|
}
|
44
types/bitmasks.go
Normal file
44
types/bitmasks.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
type BitMask interface {
|
||||||
|
HasFlag(bit MaskBit) bool
|
||||||
|
AddFlag(bit MaskBit)
|
||||||
|
ClearFlag(bit MaskBit)
|
||||||
|
ToggleFlag(bit MaskBit)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BitMasks
|
||||||
|
type MaskBit uint8
|
||||||
|
|
||||||
|
// LDAP Connection flags
|
||||||
|
const (
|
||||||
|
LdapBindUndefined MaskBit = 1 << iota
|
||||||
|
LdapBindNone // GSSAPI via SASL or (TODO) Anonymous bind
|
||||||
|
LdapBindNet
|
||||||
|
LdapBindTls
|
||||||
|
LdapBindStartTls
|
||||||
|
LdapBindSasl
|
||||||
|
LdapBindNoPassword
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f MaskBit) HasFlag(flag MaskBit) (r bool) {
|
||||||
|
if f&flag != 0 {
|
||||||
|
r = true
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *MaskBit) AddFlag(flag MaskBit) {
|
||||||
|
*f |= flag
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *MaskBit) ClearFlag(flag MaskBit) {
|
||||||
|
*f &= flag
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *MaskBit) ToggleFlag(flag MaskBit) {
|
||||||
|
*f ^= flag
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user