diff --git a/backend.go b/backend.go index 7484b40..44fa32f 100644 --- a/backend.go +++ b/backend.go @@ -1,40 +1,74 @@ package logging import ( + "errors" + "fmt" "io" "os" ) type Backend interface { Write(*Record) error - SetLevel(Level) SetFormatter(*Formatter) + SetLevel(Level) + Level() Level } -type StdoutBackend struct { +// +// Backend to write in file-like objects +// + +type FileBackend struct { l io.Writer - level Level formatter *Formatter + level Level } -func NewStdoutBackend() (b *StdoutBackend) { - b = &StdoutBackend{ +// Creates a new backend to write the logs on the standard output +func NewStdoutBackend() (b *FileBackend) { + b = &FileBackend{ l: os.Stdout, formatter: &defaultFormatter, } return } -func (b StdoutBackend) Write(r *Record) error { +// 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, + } + return +} + +func (b FileBackend) Write(r *Record) error { text := (*b.formatter)(r) _, err := io.WriteString(b.l, text) return err } -func (b *StdoutBackend) SetLevel(l Level) { +func (b *FileBackend) SetLevel(l Level) { b.level = l } -func (b *StdoutBackend) SetFormatter(f *Formatter) { +func (b *FileBackend) Level() Level { + return b.level +} + +func (b *FileBackend) SetFormatter(f *Formatter) { b.formatter = f }