forked from External/grumble
Improved logging.
This commit is contained in:
parent
244027d41b
commit
b13dbeadf1
6 changed files with 82 additions and 6 deletions
1
Makefile
1
Makefile
|
|
@ -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)
|
||||||
|
|
|
||||||
6
args.go
6
args.go
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
||||||
10
grumble.go
10
grumble.go
|
|
@ -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
53
log.go
Normal 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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue