Skip to content
Snippets Groups Projects
Commit 2c0b3fad authored by Gabriel Zachmann's avatar Gabriel Zachmann
Browse files

improve smart logging performance + fix file creation bug

parent c6fb59a1
No related branches found
No related tags found
No related merge requests found
...@@ -33,8 +33,10 @@ func (h *rootHook) Levels() []log.Level { ...@@ -33,8 +33,10 @@ func (h *rootHook) Levels() []log.Level {
return log.AllLevels return log.AllLevels
} }
func (h *rootHook) Fire(e *log.Entry) error { func (h *rootHook) Fire(e *log.Entry) error {
if err := h.buffer.Fire(e); err != nil { if !h.error.firedBefore {
return err if err := h.buffer.Fire(e); err != nil {
return err
}
} }
if h.error.firedBefore || log.ErrorLevel >= e.Level { if h.error.firedBefore || log.ErrorLevel >= e.Level {
if err := h.error.Fire(e); err != nil { if err := h.error.Fire(e); err != nil {
...@@ -53,26 +55,40 @@ type errorHook struct { ...@@ -53,26 +55,40 @@ type errorHook struct {
func (h *errorHook) Levels() []log.Level { func (h *errorHook) Levels() []log.Level {
return log.AllLevels // we must be triggered at return log.AllLevels // we must be triggered at
} }
func (h *errorHook) Fire(_ *log.Entry) error { func (h *errorHook) Fire(e *log.Entry) (err error) {
if !h.firedBefore { var logData []byte
if h.firedBefore {
logData, err = e.Bytes()
if err != nil {
return
}
} else {
logData = h.smartLoggerContext.buffer.Bytes()
// from now on we will log all future log messages directly to file (if there are any) // from now on we will log all future log messages directly to file (if there are any)
h.firedBefore = true h.firedBefore = true
h.smartLoggerContext.buffer.Reset()
} }
logData := h.smartLoggerContext.buffer.Bytes() file, errr := h.getFile()
if _, err := h.file.Write(logData); err != nil { if errr != nil {
return err return errr
} }
h.smartLoggerContext.buffer.Reset() if _, err = file.Write(logData); err != nil {
return nil return
}
return
} }
func newErrorHook(ctx *smartLoggerContext) (*errorHook, error) { func (h *errorHook) getFile() (io.Writer, error) {
h := &errorHook{ var err error
if h.file == nil {
h.file, err = getFile(filepath.Join(config.Get().Logging.Internal.Smart.Dir, h.smartLoggerContext.id))
}
return h.file, err
}
func newErrorHook(ctx *smartLoggerContext) *errorHook {
return &errorHook{
smartLoggerContext: ctx, smartLoggerContext: ctx,
} }
var err error
h.file, err = getFile(filepath.Join(config.Get().Logging.Internal.Smart.Dir, h.smartLoggerContext.id))
return h, err
} }
func newBufferHook(ctx *smartLoggerContext) log.Hook { func newBufferHook(ctx *smartLoggerContext) log.Hook {
return &writer.Hook{ return &writer.Hook{
...@@ -80,12 +96,11 @@ func newBufferHook(ctx *smartLoggerContext) log.Hook { ...@@ -80,12 +96,11 @@ func newBufferHook(ctx *smartLoggerContext) log.Hook {
LogLevels: log.AllLevels, LogLevels: log.AllLevels,
} }
} }
func newRootHook(ctx *smartLoggerContext) (*rootHook, error) { func newRootHook(ctx *smartLoggerContext) *rootHook {
eh, err := newErrorHook(ctx)
return &rootHook{ return &rootHook{
buffer: newBufferHook(ctx), buffer: newBufferHook(ctx),
error: eh, error: newErrorHook(ctx),
}, err }
} }
func smartPrepareLogger(rootH *rootHook) *log.Logger { func smartPrepareLogger(rootH *rootHook) *log.Logger {
...@@ -119,12 +134,7 @@ func getIDlogger(id string) log.Ext1FieldLogger { ...@@ -119,12 +134,7 @@ func getIDlogger(id string) log.Ext1FieldLogger {
id: id, id: id,
}, },
} }
var err error smartLog.rootHook = newRootHook(&smartLog.ctx)
smartLog.rootHook, err = newRootHook(&smartLog.ctx)
if err != nil {
log.WithError(err).Error("cannot create smart logger")
return getLogEntry(id, log.StandardLogger())
}
logger := smartPrepareLogger(smartLog.rootHook) logger := smartPrepareLogger(smartLog.rootHook)
smartLog.Entry = getLogEntry(id, logger) smartLog.Entry = getLogEntry(id, logger)
return smartLog return smartLog
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment