refactor audit logging

Signed-off-by: jkoberg <jkoberg@owncloud.com>
This commit is contained in:
jkoberg
2022-03-08 15:41:49 +01:00
parent 1609bb3a7c
commit 773ada6873
2 changed files with 52 additions and 26 deletions

View File

@@ -39,7 +39,7 @@ func Server(cfg *config.Config) *cli.Command {
return err
}
svc.StartAuditLogger(cfg.Auditlog, evts, logger)
svc.AuditLoggerFromConfig(cfg.Auditlog, evts, logger)
return nil
},
}

View File

@@ -11,8 +11,30 @@ import (
"github.com/owncloud/ocis/ocis-pkg/log"
)
// StartAuditLogger starts the audit logger
func StartAuditLogger(c config.Auditlog, ch <-chan interface{}, log log.Logger) {
// Log is used to log to different outputs
type Log func([]byte)
// Marshaller is used to marshal events
type Marshaller func(interface{}) ([]byte, error)
// AuditLoggerFromConfig will start a new AuditLogger generated from the config
func AuditLoggerFromConfig(cfg config.Auditlog, ch <-chan interface{}, log log.Logger) {
var logs []Log
if cfg.LogToConsole {
logs = append(logs, WriteToStdout())
}
if cfg.LogToFile {
logs = append(logs, WriteToFile(cfg.FilePath, log))
}
StartAuditLogger(ch, log, Marshal(cfg.Format, log), logs...)
}
// StartAuditLogger will block. run in seperate go routine
func StartAuditLogger(ch <-chan interface{}, log log.Logger, marshaller Marshaller, logto ...Log) {
for {
i := <-ch
@@ -26,44 +48,48 @@ func StartAuditLogger(c config.Auditlog, ch <-chan interface{}, log log.Logger)
}
b, err := marshal(auditEvent, c.Format)
b, err := marshaller(auditEvent)
if err != nil {
log.Error().Err(err).Msg("error marshaling the event")
continue
}
if c.LogToConsole {
log.Error().Msg(string(b))
for _, l := range logto {
l(b)
}
if c.LogToFile {
err := writeToFile(c.FilePath, b)
if err != nil {
log.Error().Err(err).Msg("error writing audit log file")
}
}
}
}
func writeToFile(path string, ev []byte) error {
file, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return err
// WriteToFile returns a Log function writing to a file
func WriteToFile(path string, log log.Logger) Log {
return func(content []byte) {
file, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Error().Err(err).Msgf("error opening file '%s'", path)
return
}
defer file.Close()
if _, err := fmt.Fprintln(file, string(content)); err != nil {
log.Error().Err(err).Msgf("error writing to file '%s'", path)
}
}
defer file.Close()
if _, err := fmt.Fprintln(file, string(ev)); err != nil {
return err
}
return nil
}
func marshal(ev interface{}, format string) ([]byte, error) {
// WriteToStdout return a Log function writing to Stdout
func WriteToStdout() Log {
return func(content []byte) {
fmt.Println(string(content))
}
}
// Marshal returns a Marshaller from the `format` string
func Marshal(format string, log log.Logger) Marshaller {
switch format {
default:
return nil, fmt.Errorf("unsupported format '%s'", format)
log.Error().Msgf("unknown format '%s'", format)
return nil
case "json":
return json.Marshal(ev)
return json.Marshal
}
}