i think logging is done
This commit is contained in:
parent
d085d0f3ee
commit
fe378850af
3
logging/TODO
Normal file
3
logging/TODO
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
- Implement code line/func/etc. (only for debug?):
|
||||||
|
https://stackoverflow.com/a/24809646
|
||||||
|
https://golang.org/pkg/runtime/#Caller
|
@ -1,6 +1,7 @@
|
|||||||
package logging
|
package logging
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
`log/syslog`
|
||||||
`os`
|
`os`
|
||||||
|
|
||||||
`r00t2.io/goutils/types`
|
`r00t2.io/goutils/types`
|
||||||
@ -9,6 +10,9 @@ import (
|
|||||||
const (
|
const (
|
||||||
devlog string = "/dev/log"
|
devlog string = "/dev/log"
|
||||||
logPerm os.FileMode = 0600
|
logPerm os.FileMode = 0600
|
||||||
|
logPrefix string = "GOLANG PROGRAM"
|
||||||
|
appendFlags int = os.O_APPEND|os.O_CREATE|os.O_WRONLY
|
||||||
|
syslogFacility syslog.Priority = syslog.LOG_USER
|
||||||
)
|
)
|
||||||
|
|
||||||
// Flags for logger configuration
|
// Flags for logger configuration
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
native `log`
|
native `log`
|
||||||
`os`
|
`os`
|
||||||
`path`
|
`path`
|
||||||
`strings`
|
|
||||||
|
|
||||||
"r00t2.io/goutils/types"
|
"r00t2.io/goutils/types"
|
||||||
|
|
||||||
@ -16,10 +15,15 @@ var (
|
|||||||
_ = sysd.Enabled()
|
_ = sysd.Enabled()
|
||||||
_ = native.Logger{}
|
_ = native.Logger{}
|
||||||
_ = os.Interrupt
|
_ = os.Interrupt
|
||||||
_ = types.Env{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetLogger(enableDebug bool, prefix string) (logger Logger, err error) {
|
// GetLogger returns an instance of Logger that best suits your system's capabilities.
|
||||||
|
// If enableDebug is true, debug messages (which according to your program may or may not contain sensitive data) are rendered and written.
|
||||||
|
// If prefix is "\x00" (a null byte), then the default logging prefix will be used. If anything else, even an empty string,
|
||||||
|
// is specified then that will be used instead for the prefix.
|
||||||
|
// logpaths is an (optional) list of strings to use as paths to test for writing. If the file can be created/written to,
|
||||||
|
// it will be used (assuming you have no higher-level loggers available). Only the first logpaths entry that "works" will be used, later entries will be ignored.
|
||||||
|
func GetLogger(enableDebug bool, prefix string, logpaths ...string) (logger Logger, err error) {
|
||||||
|
|
||||||
var logPath string
|
var logPath string
|
||||||
var logflags types.MaskBit
|
var logflags types.MaskBit
|
||||||
@ -40,8 +44,13 @@ func GetLogger(enableDebug bool, prefix string) (logger Logger, err error) {
|
|||||||
if hasSyslog && !stat.Mode().IsRegular() {logflags.AddFlag(LogSyslog)} else {
|
if hasSyslog && !stat.Mode().IsRegular() {logflags.AddFlag(LogSyslog)} else {
|
||||||
var exists bool
|
var exists bool
|
||||||
var success bool
|
var success bool
|
||||||
|
var ckLogPaths []string
|
||||||
logflags.AddFlag(LogStdout)
|
logflags.AddFlag(LogStdout)
|
||||||
for _, p := range defLogPaths {
|
ckLogPaths = defLogPaths
|
||||||
|
if logpaths != nil {
|
||||||
|
ckLogPaths = logpaths
|
||||||
|
}
|
||||||
|
for _, p := range ckLogPaths {
|
||||||
if exists, _ = paths.RealPathExists(&p); exists {
|
if exists, _ = paths.RealPathExists(&p); exists {
|
||||||
if success, err = testOpen(p); err != nil {
|
if success, err = testOpen(p); err != nil {
|
||||||
continue
|
continue
|
||||||
@ -72,30 +81,34 @@ func GetLogger(enableDebug bool, prefix string) (logger Logger, err error) {
|
|||||||
if logflags.HasFlag(LogJournald) {
|
if logflags.HasFlag(LogJournald) {
|
||||||
logger = &SystemDLogger{
|
logger = &SystemDLogger{
|
||||||
Prefix: logPrefix,
|
Prefix: logPrefix,
|
||||||
|
EnableDebug: enableDebug,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if logflags.HasFlag(LogSyslog) {
|
if logflags.HasFlag(LogSyslog) {
|
||||||
logger = &SyslogLogger{
|
logger = &SyslogLogger{
|
||||||
Prefix: logPrefix,
|
Prefix: logPrefix,
|
||||||
|
EnableDebug: enableDebug,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if logflags.HasFlag(LogFile) {
|
if logflags.HasFlag(LogFile) {
|
||||||
logger = &FileLogger{
|
logger = &FileLogger{
|
||||||
StdLogger: StdLogger{
|
StdLogger: StdLogger{
|
||||||
Prefix: logPrefix,
|
Prefix: logPrefix,
|
||||||
|
EnableDebug: enableDebug,
|
||||||
},
|
},
|
||||||
Path: logPath,
|
Path: logPath,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger = &StdLogger{
|
logger = &StdLogger{
|
||||||
Prefix: logPrefix,
|
Prefix: logPrefix,
|
||||||
|
EnableDebug: enableDebug,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.doDebug(enableDebug)
|
logger.Setup()
|
||||||
if strings.TrimSpace(prefix) != "" {
|
if prefix != "\x00" {
|
||||||
logger.setPrefix(prefix)
|
logger.setPrefix(prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +119,7 @@ func testOpen(path string) (success bool, err error) {
|
|||||||
var f *os.File
|
var f *os.File
|
||||||
|
|
||||||
// Example #2, https://golang.org/pkg/os/#OpenFile
|
// Example #2, https://golang.org/pkg/os/#OpenFile
|
||||||
if f, err = os.OpenFile(path, os.O_RDWR | os.O_CREATE, logPerm); err != nil {
|
if f, err = os.OpenFile(path, appendFlags, logPerm); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
@ -1,41 +1,176 @@
|
|||||||
package logging
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`fmt`
|
||||||
|
`io`
|
||||||
|
`log`
|
||||||
|
`os`
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l *FileLogger) Setup() {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
// https://stackoverflow.com/a/36719588/733214
|
||||||
|
multi := io.MultiWriter(os.Stdout, l.writer)
|
||||||
|
l.Logger.SetOutput(multi)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) Shutdown() {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if err = l.writer.Close(); err != nil {
|
||||||
|
log.Panicf("could not close log file \"%v\": %v\n", l.Path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (l *FileLogger) doDebug(d bool) {
|
func (l *FileLogger) doDebug(d bool) {
|
||||||
l.EnableDebug = d
|
l.EnableDebug = d
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) setPrefix(prefix string) {
|
func (l *FileLogger) setPrefix(prefix string) {
|
||||||
l.Prefix = prefix
|
l.Prefix = prefix
|
||||||
|
l.Logger.SetPrefix(prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Alert(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "ALERT")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Crit(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "CRITICAL")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Debug(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
if !l.EnableDebug {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "DEBUG")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Emerg(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "EMERGENCY")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Err(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "ERROR")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Info(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "INFO")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Notice(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "NOTICE")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *FileLogger) Warning(s string, v ...interface{}) (err error) {
|
func (l *FileLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "WARNING")
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *FileLogger) renderWrite(msg, prio string) {
|
||||||
|
|
||||||
|
s := fmt.Sprintf("[%v] %v", prio, msg)
|
||||||
|
|
||||||
|
l.Logger.Println(s)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1,41 +1,163 @@
|
|||||||
package logging
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`fmt`
|
||||||
|
`log`
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l *StdLogger) Setup() {
|
||||||
|
|
||||||
|
l.Logger = log.Default()
|
||||||
|
l.Logger.SetPrefix(l.Prefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) Shutdown() {
|
||||||
|
|
||||||
|
// NOOP
|
||||||
|
_ = ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (l *StdLogger) doDebug(d bool) {
|
func (l *StdLogger) doDebug(d bool) {
|
||||||
l.EnableDebug = d
|
l.EnableDebug = d
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) setPrefix(prefix string) {
|
func (l *StdLogger) setPrefix(prefix string) {
|
||||||
l.Prefix = prefix
|
l.Prefix = prefix
|
||||||
|
l.Logger.SetPrefix(prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Alert(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "ALERT")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Crit(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "CRITICAL")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Debug(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
if !l.EnableDebug {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "DEBUG")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Emerg(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "EMERGENCY")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Err(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "ERROR")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Info(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "INFO")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Notice(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "NOTICE")
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StdLogger) Warning(s string, v ...interface{}) (err error) {
|
func (l *StdLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, "WARNING")
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *StdLogger) renderWrite(msg, prio string) {
|
||||||
|
|
||||||
|
s := fmt.Sprintf("[%v] %v", prio, msg)
|
||||||
|
|
||||||
|
l.Logger.Println(s)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,26 @@
|
|||||||
package logging
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`fmt`
|
||||||
|
`log`
|
||||||
|
|
||||||
|
`github.com/coreos/go-systemd/journal`
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Setup() {
|
||||||
|
|
||||||
|
// NOOP
|
||||||
|
_ = ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) Shutdown() {
|
||||||
|
|
||||||
|
// NOOP
|
||||||
|
_ = ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) doDebug(d bool) {
|
func (l *SystemDLogger) doDebug(d bool) {
|
||||||
l.EnableDebug = d
|
l.EnableDebug = d
|
||||||
}
|
}
|
||||||
@ -9,33 +30,146 @@ func (l *SystemDLogger) setPrefix(prefix string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Alert(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriAlert)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Crit(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriCrit)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Debug(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
if !l.EnableDebug {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriDebug)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Emerg(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriEmerg)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Err(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriErr)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Info(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriInfo)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Notice(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriNotice)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SystemDLogger) Warning(s string, v ...interface{}) (err error) {
|
func (l *SystemDLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
l.renderWrite(msg, journal.PriWarning)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SystemDLogger) renderWrite(msg string, prio journal.Priority) {
|
||||||
|
// TODO: implement code line, etc.
|
||||||
|
// https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
|
||||||
|
// CODE_FILE=, CODE_LINE=, CODE_FUNC=
|
||||||
|
var err error
|
||||||
|
|
||||||
|
vars := map[string]string{
|
||||||
|
"DOCUMENTATION": "https://git.r00t2.io/Go_GoUtils/",
|
||||||
|
"SYSLOG_IDENTIFIER": l.Prefix,
|
||||||
|
"SYSLOG_FACILITY": "1", // USER
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = journal.Send(msg, prio, vars); err != nil {
|
||||||
|
log.Panicln("could not send to Journald")
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1,41 +1,198 @@
|
|||||||
package logging
|
package logging
|
||||||
|
|
||||||
|
import (
|
||||||
|
`fmt`
|
||||||
|
`log`
|
||||||
|
`log/syslog`
|
||||||
|
)
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Setup() {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if l.alert, err = syslog.New(syslog.LOG_ALERT | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Alert")
|
||||||
|
}
|
||||||
|
if l.crit, err = syslog.New(syslog.LOG_CRIT | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Crit")
|
||||||
|
}
|
||||||
|
if l.debug, err = syslog.New(syslog.LOG_DEBUG | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Debug")
|
||||||
|
}
|
||||||
|
if l.emerg, err = syslog.New(syslog.LOG_EMERG | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Emerg")
|
||||||
|
}
|
||||||
|
if l.err, err = syslog.New(syslog.LOG_ERR | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Err")
|
||||||
|
}
|
||||||
|
if l.info, err = syslog.New(syslog.LOG_INFO | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Info")
|
||||||
|
}
|
||||||
|
if l.notice, err = syslog.New(syslog.LOG_NOTICE | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Notice")
|
||||||
|
}
|
||||||
|
if l.warning, err = syslog.New(syslog.LOG_WARNING | syslogFacility, l.Prefix); err != nil {
|
||||||
|
log.Panicln("could not open log for Warning")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *SyslogLogger) Shutdown() {
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
for _, i := range []*syslog.Writer{l.alert, l.crit, l.debug, l.emerg, l.err, l.info, l.notice, l.warning} {
|
||||||
|
if err = i.Close(); err != nil {
|
||||||
|
log.Panicf("could not close log %#v\n", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) doDebug(d bool) {
|
func (l *SyslogLogger) doDebug(d bool) {
|
||||||
l.EnableDebug = d
|
l.EnableDebug = d
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) setPrefix(prefix string) {
|
func (l *SyslogLogger) setPrefix(prefix string) {
|
||||||
l.Prefix = prefix
|
l.Prefix = prefix
|
||||||
|
l.Setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Alert(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Alert(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.alert.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:ALERT facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Crit(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Crit(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.crit.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:CRIT facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Debug(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Debug(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
if !l.EnableDebug {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.debug.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:DEBUG facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Emerg(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Emerg(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.emerg.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:EMERG facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Err(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Err(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.err.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:ERR facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Info(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Info(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.info.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:INFO facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Notice(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Notice(s string, v ...interface{}) (err error) {
|
||||||
|
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.notice.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:NOTICE facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *SyslogLogger) Warning(s string, v ...interface{}) (err error) {
|
func (l *SyslogLogger) Warning(s string, v ...interface{}) (err error) {
|
||||||
|
var msg string
|
||||||
|
|
||||||
|
if v != nil {
|
||||||
|
msg = fmt.Sprintf(s, v...)
|
||||||
|
} else {
|
||||||
|
msg = s
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = l.warning.Write([]byte(msg)); err != nil {
|
||||||
|
log.Panicf("could not write %v to syslog USER:WARNING facility/level", msg)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package logging
|
|||||||
import (
|
import (
|
||||||
`log`
|
`log`
|
||||||
`log/syslog`
|
`log/syslog`
|
||||||
|
`os`
|
||||||
)
|
)
|
||||||
|
|
||||||
type Logger interface {
|
type Logger interface {
|
||||||
@ -16,6 +17,8 @@ type Logger interface {
|
|||||||
Warning(string, ...interface{}) error
|
Warning(string, ...interface{}) error
|
||||||
doDebug(bool)
|
doDebug(bool)
|
||||||
setPrefix(string)
|
setPrefix(string)
|
||||||
|
Setup()
|
||||||
|
Shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
type SystemDLogger struct {
|
type SystemDLogger struct {
|
||||||
@ -24,21 +27,26 @@ type SystemDLogger struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SyslogLogger struct {
|
type SyslogLogger struct {
|
||||||
syslog.Writer
|
|
||||||
EnableDebug bool
|
EnableDebug bool
|
||||||
Prefix string
|
Prefix string
|
||||||
|
alert,
|
||||||
|
crit,
|
||||||
|
debug,
|
||||||
|
emerg,
|
||||||
|
err,
|
||||||
|
info,
|
||||||
|
notice,
|
||||||
|
warning *syslog.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
type StdLogger struct {
|
type StdLogger struct {
|
||||||
log.Logger
|
*log.Logger
|
||||||
EnableDebug bool
|
EnableDebug bool
|
||||||
Prefix string
|
Prefix string
|
||||||
}
|
}
|
||||||
|
|
||||||
type FileLogger struct {
|
type FileLogger struct {
|
||||||
log.Logger
|
|
||||||
StdLogger
|
StdLogger
|
||||||
EnableDebug bool
|
Path string
|
||||||
Path string
|
writer *os.File
|
||||||
Prefix string
|
|
||||||
}
|
}
|
||||||
|
@ -10,17 +10,6 @@ type BitMask interface {
|
|||||||
// BitMasks
|
// BitMasks
|
||||||
type MaskBit uint8
|
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) {
|
func (f MaskBit) HasFlag(flag MaskBit) (r bool) {
|
||||||
if f&flag != 0 {
|
if f&flag != 0 {
|
||||||
r = true
|
r = true
|
||||||
|
Loading…
Reference in New Issue
Block a user