Adadt config package to new module system

This commit is contained in:
Daniel 2018-08-23 14:57:25 +02:00
parent 4c857f01ce
commit cfca5386cf
5 changed files with 60 additions and 93 deletions

13
log/flags.go Normal file
View file

@ -0,0 +1,13 @@
package log
import "flag"
var (
logLevelFlag string
fileLogLevelsFlag string
)
func init() {
flag.StringVar(&logLevelFlag, "log", "info", "set log level to [trace|debug|info|warning|error|critical]")
flag.StringVar(&fileLogLevelsFlag, "flog", "", "set log level of files: database=trace,firewall=debug")
}

View file

@ -1,60 +0,0 @@
// Copyright Safing ICS Technologies GmbH. Use of this source code is governed by the AGPL license that can be found in the LICENSE file.
package log
var Logger *LoggingInterface
type LoggingInterface struct {
}
func (*LoggingInterface) Tracef(things ...interface{}) {
Tracef(things...)
}
func (*LoggingInterface) Trace(msg string) {
Trace(msg)
}
func (*LoggingInterface) Debugf(things ...interface{}) {
Debugf(things...)
}
func (*LoggingInterface) Debug(msg string) {
Debug(msg)
}
func (*LoggingInterface) Infof(things ...interface{}) {
Infof(things...)
}
func (*LoggingInterface) Info(msg string) {
Info(msg)
}
func (*LoggingInterface) Warningf(things ...interface{}) {
Warningf(things...)
}
func (*LoggingInterface) Warning(msg string) {
Warning(msg)
}
func (*LoggingInterface) Errorf(things ...interface{}) {
Errorf(things...)
}
func (*LoggingInterface) Error(msg string) {
Error(msg)
}
func (*LoggingInterface) Criticalf(things ...interface{}) {
Criticalf(things...)
}
func (*LoggingInterface) Critical(msg string) {
Critical(msg)
}
func init() {
Logger = &LoggingInterface{}
}

View file

@ -10,9 +10,6 @@ import (
"time" "time"
"github.com/tevino/abool" "github.com/tevino/abool"
"github.com/Safing/safing-core/meta"
"github.com/Safing/safing-core/modules"
) )
// concept // concept
@ -54,8 +51,6 @@ const (
) )
var ( var (
module *modules.Module
logBuffer chan *logLine logBuffer chan *logLine
forceEmptyingOfBuffer chan bool forceEmptyingOfBuffer chan bool
@ -68,6 +63,12 @@ var (
logsWaiting = make(chan bool, 1) logsWaiting = make(chan bool, 1)
logsWaitingFlag = abool.NewBool(false) logsWaitingFlag = abool.NewBool(false)
shutdownSignal = make(chan struct{}, 0)
shutdownWaitGroup sync.WaitGroup
started = abool.NewBool(false)
testErrors = abool.NewBool(false)
) )
func SetFileLevels(levels map[string]severity) { func SetFileLevels(levels map[string]severity) {
@ -103,37 +104,34 @@ func ParseLevel(level string) severity {
return 0 return 0
} }
var () func Start() error {
func init() { if !started.SetToIf(false, true) {
return nil
module = modules.Register("Logging", 0) }
modules.RegisterLogger(Logger)
logBuffer = make(chan *logLine, 8192) logBuffer = make(chan *logLine, 8192)
forceEmptyingOfBuffer = make(chan bool, 4) forceEmptyingOfBuffer = make(chan bool, 4)
initialLogLevel := ParseLevel(meta.LogLevel()) initialLogLevel := ParseLevel(logLevelFlag)
if initialLogLevel > 0 { if initialLogLevel > 0 {
atomic.StoreUint32(logLevel, uint32(initialLogLevel)) atomic.StoreUint32(logLevel, uint32(initialLogLevel))
} else { } else {
fmt.Printf("WARNING: invalid log level, falling back to level info.") return fmt.Errorf("invalid log level \"%s\", falling back to level info", logLevelFlag)
} }
// get and set file loglevels // get and set file loglevels
fileLogLevels := meta.FileLogLevels() fileLogLevels := fileLogLevelsFlag
if len(fileLogLevels) > 0 { if len(fileLogLevels) > 0 {
newFileLevels := make(map[string]severity) newFileLevels := make(map[string]severity)
for _, pair := range strings.Split(fileLogLevels, ",") { for _, pair := range strings.Split(fileLogLevels, ",") {
splitted := strings.Split(pair, "=") splitted := strings.Split(pair, "=")
if len(splitted) != 2 { if len(splitted) != 2 {
fmt.Printf("WARNING: invalid file log level \"%s\", ignoring", pair) return fmt.Errorf("invalid file log level \"%s\", ignoring", pair)
continue
} }
fileLevel := ParseLevel(splitted[1]) fileLevel := ParseLevel(splitted[1])
if fileLevel == 0 { if fileLevel == 0 {
fmt.Printf("WARNING: invalid file log level \"%s\", ignoring", pair) return fmt.Errorf("invalid file log level \"%s\", ignoring", pair)
continue
} }
newFileLevels[splitted[0]] = fileLevel newFileLevels[splitted[0]] = fileLevel
} }
@ -141,5 +139,13 @@ func init() {
} }
go writer() go writer()
Info("logging: started")
return nil
} }
// Shutdown writes remaining log lines and then stops the logger.
func Shutdown() {
close(shutdownSignal)
shutdownWaitGroup.Wait()
}

View file

@ -10,6 +10,11 @@ import (
// test waiting // test waiting
func TestLogging(t *testing.T) { func TestLogging(t *testing.T) {
err := Start()
if err != nil {
t.Errorf("start failed: %s", err)
}
// skip // skip
if testing.Short() { if testing.Short() {
t.Skip("skipping test in short mode.") t.Skip("skipping test in short mode.")

View file

@ -4,7 +4,7 @@ package log
import ( import (
"fmt" "fmt"
"github.com/Safing/safing-core/taskmanager" "github.com/Safing/portbase/taskmanager"
"time" "time"
) )
@ -20,6 +20,8 @@ func writeLine(line *logLine) {
func writer() { func writer() {
var line *logLine var line *logLine
startedTask := false startedTask := false
shutdownWaitGroup.Add(1)
defer shutdownWaitGroup.Done()
for { for {
@ -27,7 +29,7 @@ func writer() {
select { select {
case <-logsWaiting: case <-logsWaiting:
logsWaitingFlag.UnSet() logsWaitingFlag.UnSet()
case <-module.Stop: case <-shutdownSignal:
} }
// wait for timeslot to log, or when buffer is full // wait for timeslot to log, or when buffer is full
@ -35,7 +37,8 @@ func writer() {
case <-taskmanager.StartVeryLowPriorityMicroTask(): case <-taskmanager.StartVeryLowPriorityMicroTask():
startedTask = true startedTask = true
case <-forceEmptyingOfBuffer: case <-forceEmptyingOfBuffer:
case <-module.Stop: case <-shutdownSignal:
for {
select { select {
case line = <-logBuffer: case line = <-logBuffer:
writeLine(line) writeLine(line)
@ -47,10 +50,10 @@ func writer() {
"", "",
0, 0,
}) })
module.StopComplete()
return return
} }
} }
}
// write all the logs! // write all the logs!
writeLoop: writeLoop: