github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/logging/loggers/file_logger.go (about)

     1  package loggers
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"text/template"
     8  	"time"
     9  
    10  	"github.com/go-kit/kit/log"
    11  	"github.com/hyperledger/burrow/logging/structure"
    12  )
    13  
    14  type FileLogger struct {
    15  	path         string
    16  	file         *os.File
    17  	formatName   string
    18  	streamLogger log.Logger
    19  }
    20  
    21  type FileTemplateParams struct {
    22  	Date time.Time
    23  }
    24  
    25  func NewFileTemplateParams() *FileTemplateParams {
    26  	return &FileTemplateParams{
    27  		Date: time.Now(),
    28  	}
    29  }
    30  
    31  const timeFormat = "2006-01-02_15h04m05s"
    32  
    33  func (ftp *FileTemplateParams) Timestamp() string {
    34  	return ftp.Date.Format(timeFormat)
    35  }
    36  
    37  func NewFileLogger(path string, formatName string) (*FileLogger, error) {
    38  	tmpl, err := template.New("file-logger").Parse(path)
    39  	if err != nil {
    40  		return nil, fmt.Errorf("could not parse path string '%s' as Go text/template: %v", path, err)
    41  	}
    42  	buf := new(bytes.Buffer)
    43  	err = tmpl.Execute(buf, NewFileTemplateParams())
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	fl := &FileLogger{
    48  		path:       buf.String(),
    49  		formatName: formatName,
    50  	}
    51  	err = fl.Reload()
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	return fl, nil
    56  }
    57  
    58  func (fl *FileLogger) Log(keyvals ...interface{}) error {
    59  	switch structure.Signal(keyvals) {
    60  	case structure.SyncSignal:
    61  		return fl.file.Sync()
    62  	case structure.ReloadSignal:
    63  		return fl.Reload()
    64  	default:
    65  		return fl.streamLogger.Log(keyvals...)
    66  	}
    67  }
    68  
    69  func (fl *FileLogger) Reload() error {
    70  	if fl.file != nil {
    71  		err := fl.file.Close()
    72  		if err != nil {
    73  			return fmt.Errorf("could not close file %v: %v", fl.file, err)
    74  		}
    75  	}
    76  	var err error
    77  	fl.file, err = os.OpenFile(fl.path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    78  	if err != nil {
    79  		return err
    80  	}
    81  	fl.streamLogger, err = NewStreamLogger(fl.file, fl.formatName)
    82  	if err != nil {
    83  		return err
    84  	}
    85  	return nil
    86  }