From 773ada68738c9671989a7900daa2944a5a7d4484 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Tue, 8 Mar 2022 15:41:49 +0100 Subject: [PATCH] refactor audit logging Signed-off-by: jkoberg --- audit/pkg/command/server.go | 2 +- audit/pkg/service/service.go | 76 ++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/audit/pkg/command/server.go b/audit/pkg/command/server.go index b88ab633f9..66609780a3 100644 --- a/audit/pkg/command/server.go +++ b/audit/pkg/command/server.go @@ -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 }, } diff --git a/audit/pkg/service/service.go b/audit/pkg/service/service.go index 0fc90ae590..b0f8703f82 100644 --- a/audit/pkg/service/service.go +++ b/audit/pkg/service/service.go @@ -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 } }