2013-06-21 18:35:47 +02:00
|
|
|
package logging
|
|
|
|
|
|
|
|
import (
|
2013-06-24 17:37:46 +02:00
|
|
|
"errors"
|
|
|
|
"fmt"
|
2013-06-21 18:35:47 +02:00
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Backend interface {
|
|
|
|
Write(*Record) error
|
|
|
|
SetFormatter(*Formatter)
|
2013-06-24 17:37:46 +02:00
|
|
|
SetLevel(Level)
|
|
|
|
Level() Level
|
2014-12-04 20:25:49 +01:00
|
|
|
Reopen() error
|
2013-06-21 18:35:47 +02:00
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
//
|
|
|
|
// Backend to write in file-like objects
|
|
|
|
//
|
|
|
|
|
|
|
|
type FileBackend struct {
|
2013-06-21 18:35:47 +02:00
|
|
|
l io.Writer
|
|
|
|
formatter *Formatter
|
2013-06-24 17:37:46 +02:00
|
|
|
level Level
|
2014-12-04 20:25:49 +01:00
|
|
|
filepath string
|
2013-06-21 18:35:47 +02:00
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
// Creates a new backend to write the logs on the standard output
|
|
|
|
func NewStdoutBackend() (b *FileBackend) {
|
|
|
|
b = &FileBackend{
|
2013-06-21 18:35:47 +02:00
|
|
|
l: os.Stdout,
|
|
|
|
formatter: &defaultFormatter,
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
// Creates a new backend to write the logs on the error output
|
|
|
|
func NewStderrBackend() (b *FileBackend) {
|
|
|
|
b = &FileBackend{
|
|
|
|
l: os.Stderr,
|
|
|
|
formatter: &defaultFormatter,
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Creates a new backend to write the logs in a given file
|
|
|
|
func NewFileBackend(filename string) (b *FileBackend, e error) {
|
|
|
|
filename_fd, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
|
|
|
|
if err != nil {
|
|
|
|
e = errors.New(fmt.Sprintf("Cannot open log file %s (%s)", filename, err.Error()))
|
|
|
|
}
|
|
|
|
b = &FileBackend{
|
|
|
|
l: filename_fd,
|
|
|
|
formatter: &defaultFormatter,
|
2014-12-04 20:25:49 +01:00
|
|
|
filepath: filename,
|
2013-06-24 17:37:46 +02:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2014-08-27 17:42:15 +02:00
|
|
|
// Creates a new backend to write the logs in a given io.Writer
|
|
|
|
func NewIoBackend(buf io.Writer) (b *FileBackend) {
|
|
|
|
return &FileBackend{
|
|
|
|
l: buf,
|
|
|
|
formatter: &defaultFormatter,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
func (b FileBackend) Write(r *Record) error {
|
2013-06-24 17:35:43 +02:00
|
|
|
text := (*b.formatter)(r)
|
|
|
|
_, err := io.WriteString(b.l, text)
|
|
|
|
return err
|
2013-06-21 18:35:47 +02:00
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
func (b *FileBackend) SetLevel(l Level) {
|
2013-06-21 18:35:47 +02:00
|
|
|
b.level = l
|
|
|
|
}
|
|
|
|
|
2013-06-24 17:37:46 +02:00
|
|
|
func (b *FileBackend) Level() Level {
|
|
|
|
return b.level
|
|
|
|
}
|
|
|
|
|
|
|
|
func (b *FileBackend) SetFormatter(f *Formatter) {
|
2013-06-21 18:35:47 +02:00
|
|
|
b.formatter = f
|
|
|
|
}
|
2014-10-22 11:32:57 +02:00
|
|
|
|
2014-12-04 20:25:49 +01:00
|
|
|
func (b *FileBackend) Reopen() error {
|
|
|
|
if b.filepath == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-02-01 10:42:42 +01:00
|
|
|
if c, ok := b.l.(io.Closer); ok {
|
|
|
|
if err := c.Close(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fd, err := os.OpenFile(b.filepath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
|
2014-12-04 20:25:49 +01:00
|
|
|
if err != nil {
|
2020-02-01 10:42:42 +01:00
|
|
|
return fmt.Errorf("Cannot open log file %s: %w", b.filepath, err)
|
2014-12-04 20:25:49 +01:00
|
|
|
}
|
2020-02-01 10:42:42 +01:00
|
|
|
|
|
|
|
b.l = fd
|
|
|
|
|
2014-12-04 20:25:49 +01:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2014-10-22 12:35:14 +02:00
|
|
|
//
|
|
|
|
// Noop Backend
|
|
|
|
//
|
|
|
|
|
|
|
|
type NoopBackend struct{}
|
|
|
|
|
|
|
|
func NewNoopBackend() (Backend, error) {
|
|
|
|
return &NoopBackend{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (nb *NoopBackend) Write(r *Record) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (nb *NoopBackend) SetFormatter(f *Formatter) {}
|
|
|
|
|
|
|
|
func (nb *NoopBackend) SetLevel(level Level) {}
|
|
|
|
|
|
|
|
func (nb *NoopBackend) Level() Level {
|
2020-02-01 10:38:50 +01:00
|
|
|
return DefaultLevel
|
2014-10-22 12:35:14 +02:00
|
|
|
}
|
2014-12-04 20:25:49 +01:00
|
|
|
|
|
|
|
func (nb *NoopBackend) Reopen() error {
|
|
|
|
return nil
|
|
|
|
}
|