1
0
Fork 0
forked from External/grumble

Move logtarget to its own package.

This commit is contained in:
Mikkel Krautz 2011-11-10 12:18:53 +01:00
parent 5e4e81ff50
commit 79e5ffbd4d
7 changed files with 86 additions and 62 deletions

7
pkg/logtarget/Makefile Normal file
View file

@ -0,0 +1,7 @@
include $(GOROOT)/src/Make.inc
TARG = grumble/logtarget
GOFILES = \
logtarget.go
include $(GOROOT)/src/Make.pkg

View file

@ -0,0 +1,66 @@
// Copyright (c) 2011 The Grumble Authors
// The use of this source code is goverened by a BSD-style
// license that can be found in the LICENSE-file.
// Package logtarget implements a multiplexing logging target
package logtarget
import (
"bytes"
"os"
"sync"
)
// LogTarget implements the io.Writer interface, allowing
// LogTarget to be registered with the regular Go log package.
// LogTarget multiplexes its incoming writes to multiple optional
// output writers, and one main output writer (the log file).
type LogTarget struct {
mu sync.Mutex
logfn string
file *os.File
memLog *bytes.Buffer
}
var Target LogTarget
// Write writes a log message to all registered io.Writers
func (target *LogTarget) Write(in []byte) (int, error) {
target.mu.Lock()
defer target.mu.Unlock()
return target.file.Write(in)
}
// OpenFile opens the main log file for writing.
// This method will open the file in append-only mode.
func (target *LogTarget) OpenFile(fn string) (err error) {
target.logfn = fn
target.file, err = os.OpenFile(target.logfn, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0650)
if err != nil {
return err
}
return nil
}
// Rotate rotates the current log file.
// This method holds a lock while rotating the log file,
// and all log writes will be held back until the rotation
// is complete.
func (target *LogTarget) Rotate() error {
target.mu.Lock()
defer target.mu.Unlock()
// Close the existing log file
err := target.file.Close()
if err != nil {
return err
}
target.file, err = os.OpenFile(target.logfn, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0650)
if err != nil {
return err
}
return nil
}