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  }