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

View file

@ -18,7 +18,8 @@ PACKAGES = \
pkg/sessionpool \ pkg/sessionpool \
pkg/ban \ pkg/ban \
pkg/htmlfilter \ pkg/htmlfilter \
pkg/freezer pkg/freezer \
pkg/logtarget
GCFLAGS = \ GCFLAGS = \
-Ipkg/cryptstate/_obj \ -Ipkg/cryptstate/_obj \
@ -29,7 +30,8 @@ GCFLAGS = \
-Ipkg/sessionpool/_obj \ -Ipkg/sessionpool/_obj \
-Ipkg/ban/_obj \ -Ipkg/ban/_obj \
-Ipkg/htmlfilter/_obj \ -Ipkg/htmlfilter/_obj \
-Ipkg/freezer/_obj -Ipkg/freezer/_obj \
-Ipkg/logtarget/_obj
LDFLAGS = \ LDFLAGS = \
-Lpkg/cryptstate/_obj \ -Lpkg/cryptstate/_obj \
@ -40,7 +42,8 @@ LDFLAGS = \
-Lpkg/sessionpool/_obj \ -Lpkg/sessionpool/_obj \
-Lpkg/ban/_obj \ -Lpkg/ban/_obj \
-Lpkg/htmlfilter/_obj \ -Lpkg/htmlfilter/_obj \
-Lpkg/freezer/_obj -Lpkg/freezer/_obj \
-Lpkg/logtarget/_obj
GOFILES = \ GOFILES = \
grumble.go \ grumble.go \
@ -55,7 +58,6 @@ GOFILES = \
gencert.go \ gencert.go \
register.go \ register.go \
ssh.go \ ssh.go \
log.go \
args.go \ args.go \
ifeq ($(SQLITE),1) ifeq ($(SQLITE),1)

View file

@ -8,6 +8,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"grumble/blobstore" "grumble/blobstore"
"grumble/logtarget"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
@ -25,7 +26,7 @@ func main() {
return return
} }
err = LogTarget.OpenFile(Args.LogPath) err = logtarget.Target.OpenFile(Args.LogPath)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Unable to open log file: %v", err) fmt.Fprintf(os.Stderr, "Unable to open log file: %v", err)
return return
@ -33,10 +34,9 @@ func main() {
log.SetPrefix("[G] ") log.SetPrefix("[G] ")
log.SetFlags(log.LstdFlags | log.Lmicroseconds) log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.SetOutput(&LogTarget) log.SetOutput(&logtarget.Target)
log.Printf("Grumble") log.Printf("Grumble")
log.Printf("Using data directory: %s", Args.DataDir) log.Printf("Using data directory: %s", Args.DataDir)
// Open the blobstore // Open the blobstore

53
log.go
View file

@ -1,53 +0,0 @@
package main
import (
"bytes"
"os"
"sync"
)
type logTarget struct {
mu sync.Mutex
logfn string
file *os.File
memLog *bytes.Buffer
}
var LogTarget logTarget
func (target *logTarget) Write(in []byte) (int, error) {
target.mu.Lock()
defer target.mu.Unlock()
return target.file.Write(in)
}
// Open a 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
}
// Perform a log rotation
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
}

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
}

View file

@ -20,6 +20,7 @@ import (
"grumble/cryptstate" "grumble/cryptstate"
"grumble/freezer" "grumble/freezer"
"grumble/htmlfilter" "grumble/htmlfilter"
"grumble/logtarget"
"grumble/mumbleproto" "grumble/mumbleproto"
"grumble/serverconf" "grumble/serverconf"
"grumble/sessionpool" "grumble/sessionpool"
@ -165,7 +166,7 @@ func NewServer(id int64, addr string, port int) (s *Server, err error) {
s.Channels[0] = NewChannel(0, "Root") s.Channels[0] = NewChannel(0, "Root")
s.nextChanId = 1 s.nextChanId = 1
s.Logger = log.New(&LogTarget, fmt.Sprintf("[%v] ", s.Id), log.LstdFlags|log.Lmicroseconds) s.Logger = log.New(&logtarget.Target, fmt.Sprintf("[%v] ", s.Id), log.LstdFlags|log.Lmicroseconds)
return return
} }

View file

@ -6,6 +6,7 @@ package main
import ( import (
"fmt" "fmt"
"grumble/logtarget"
"os" "os"
"os/signal" "os/signal"
) )
@ -15,7 +16,7 @@ func SignalHandler() {
sig := <-signal.Incoming sig := <-signal.Incoming
if sig == os.SIGUSR2 { if sig == os.SIGUSR2 {
err := LogTarget.Rotate() err := logtarget.Target.Rotate()
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "Unable to rotate log file: %v", err) fmt.Fprintf(os.Stderr, "Unable to rotate log file: %v", err)
} }