1
0
Fork 0
forked from External/grumble

Improved logging.

This commit is contained in:
Mikkel Krautz 2011-11-10 00:38:59 +01:00
parent 244027d41b
commit b13dbeadf1
6 changed files with 82 additions and 6 deletions

View file

@ -55,6 +55,7 @@ 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

@ -11,6 +11,7 @@ import (
type args struct { type args struct {
ShowHelp bool ShowHelp bool
DataDir string DataDir string
LogPath string
SshAddr string SshAddr string
RegenKeys bool RegenKeys bool
SQLiteDB string SQLiteDB string
@ -25,6 +26,10 @@ func defaultDataDir() string {
return filepath.Join(os.Getenv("HOME"), dirname) return filepath.Join(os.Getenv("HOME"), dirname)
} }
func defaultLogPath() string {
return filepath.Join(defaultDataDir(), "grumble.log")
}
func Usage() { func Usage() {
fmt.Fprintf(os.Stderr, "usage: grumble [options]\n") fmt.Fprintf(os.Stderr, "usage: grumble [options]\n")
fmt.Fprintf(os.Stderr, "remote control: grumble [options] ctl [ctlopts]\n") fmt.Fprintf(os.Stderr, "remote control: grumble [options] ctl [ctlopts]\n")
@ -36,6 +41,7 @@ var Args args
func init() { func init() {
flag.BoolVar(&Args.ShowHelp, "help", false, "Show this help") flag.BoolVar(&Args.ShowHelp, "help", false, "Show this help")
flag.StringVar(&Args.DataDir, "datadir", defaultDataDir(), "Directory to use for server storage") flag.StringVar(&Args.DataDir, "datadir", defaultDataDir(), "Directory to use for server storage")
flag.StringVar(&Args.LogPath, "log", defaultLogPath(), "Log file path")
flag.StringVar(&Args.SshAddr, "ssh", "localhost:46545", "Address to use for SSH admin prompt") flag.StringVar(&Args.SshAddr, "ssh", "localhost:46545", "Address to use for SSH admin prompt")
flag.BoolVar(&Args.RegenKeys, "regenkeys", false, "Force Grumble to regenerate its global RSA keypair and certificate") flag.BoolVar(&Args.RegenKeys, "regenkeys", false, "Force Grumble to regenerate its global RSA keypair and certificate")

View file

@ -25,8 +25,16 @@ func main() {
return return
} }
err = LogTarget.OpenFile(Args.LogPath)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to open log file: %v", err)
return
}
log.SetPrefix("[G] ") log.SetPrefix("[G] ")
log.SetFlags(log.LstdFlags | log.Lmicroseconds) log.SetFlags(log.LstdFlags | log.Lmicroseconds)
log.SetOutput(&LogTarget)
log.Printf("Grumble") log.Printf("Grumble")
log.Printf("Using data directory: %s", Args.DataDir) log.Printf("Using data directory: %s", Args.DataDir)
@ -164,4 +172,4 @@ func main() {
go SignalHandler() go SignalHandler()
select {} select {}
} }
} }

53
log.go Normal file
View file

@ -0,0 +1,53 @@
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
}

View file

@ -26,7 +26,6 @@ import (
"hash" "hash"
"log" "log"
"net" "net"
"os"
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "sync"
@ -122,7 +121,7 @@ type clientLogForwarder struct {
} }
func (lf clientLogForwarder) Write(incoming []byte) (int, error) { func (lf clientLogForwarder) Write(incoming []byte) (int, error) {
buf := bytes.NewBuffer(nil) buf := new(bytes.Buffer)
buf.WriteString(fmt.Sprintf("<%v:%v(%v)> ", lf.client.Session, lf.client.ShownName(), lf.client.UserId())) buf.WriteString(fmt.Sprintf("<%v:%v(%v)> ", lf.client.Session, lf.client.ShownName(), lf.client.UserId()))
buf.Write(incoming) buf.Write(incoming)
lf.logger.Output(3, buf.String()) lf.logger.Output(3, buf.String())
@ -166,7 +165,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(os.Stdout, fmt.Sprintf("[%v] ", s.Id), log.LstdFlags|log.Lmicroseconds) s.Logger = log.New(&LogTarget, fmt.Sprintf("[%v] ", s.Id), log.LstdFlags|log.Lmicroseconds)
return return
} }

View file

@ -5,6 +5,7 @@
package main package main
import ( import (
"fmt"
"os" "os"
"os/signal" "os/signal"
) )
@ -12,9 +13,17 @@ import (
func SignalHandler() { func SignalHandler() {
for { for {
sig := <-signal.Incoming sig := <-signal.Incoming
if sig != os.SIGINT && sig != os.SIGTERM {
if sig == os.SIGUSR2 {
err := LogTarget.Rotate()
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to rotate log file: %v", err)
}
continue continue
} }
os.Exit(0)
if sig == os.SIGINT || sig == os.SIGTERM {
os.Exit(0)
}
} }
} }