github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/modelworkermanager/recordlogger.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelworkermanager 5 6 import ( 7 "fmt" 8 "path/filepath" 9 "time" 10 11 "github.com/juju/clock" 12 "github.com/juju/errors" 13 "github.com/juju/loggo" 14 15 corelogger "github.com/juju/juju/core/logger" 16 ) 17 18 // newModelLogger returns a buffered database logger that uses the name 19 // specified as the entity doing the logging. 20 func newModelLogger( 21 name string, 22 modelUUID string, 23 reclogger RecordLogger, 24 clock clock.Clock, 25 logger Logger, 26 ) *recordLogger { 27 // Write to the database every second, or 1024 entries, whichever comes first. 28 buffered := corelogger.NewBufferedLogger(reclogger, 1024, time.Second, clock) 29 30 return &recordLogger{ 31 recordLogger: reclogger, 32 buffer: buffered, 33 name: name, 34 modelUUID: modelUUID, 35 logger: logger, 36 } 37 } 38 39 type recordLogger struct { 40 recordLogger RecordLogger 41 buffer *corelogger.BufferedLogger 42 43 // Use struct embedding to get the Close method. 44 corelogger.Logger 45 // "controller-0" for machine-0 in the controller model. 46 name string 47 modelUUID string 48 logger Logger 49 } 50 51 func (l *recordLogger) Write(entry loggo.Entry) { 52 err := l.buffer.Log([]corelogger.LogRecord{{ 53 Time: entry.Timestamp, 54 Entity: l.name, 55 Module: entry.Module, 56 Location: fmt.Sprintf("%s:%d", filepath.Base(entry.Filename), entry.Line), 57 Level: entry.Level, 58 Message: entry.Message, 59 Labels: entry.Labels, 60 ModelUUID: l.modelUUID, 61 }}) 62 63 if err != nil { 64 l.logger.Warningf("logging to DB failed for model %q, %v", l.modelUUID, err) 65 } 66 } 67 68 func (l *recordLogger) Close() error { 69 err := errors.Trace(l.buffer.Flush()) 70 l.recordLogger.Close() 71 return err 72 }