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 }