mirror of https://github.com/ledisdb/ledisdb.git
add access log
This commit is contained in:
parent
00b5fb4b24
commit
655db07604
|
@ -8,5 +8,7 @@
|
|||
"write_buffer_size": 67108864,
|
||||
"cache_size": 524288000
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"access_log" : "access.log"
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/siddontang/go-log/log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
accessTimeFormat = "2006/01/02 15:04:05"
|
||||
)
|
||||
|
||||
type accessLog struct {
|
||||
l *log.Logger
|
||||
}
|
||||
|
||||
func newAcessLog(baseName string) (*accessLog, error) {
|
||||
l := new(accessLog)
|
||||
|
||||
h, err := log.NewTimeRotatingFileHandler(baseName, log.WhenDay, 1)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
l.l = log.New(h, log.Ltime)
|
||||
|
||||
return l, nil
|
||||
}
|
||||
|
||||
func (l *accessLog) Close() {
|
||||
l.l.Close()
|
||||
}
|
||||
|
||||
func (l *accessLog) Log(remoteAddr string, usedTime int64, cmd string, args [][]byte, err error) {
|
||||
argsFormat := make([]string, len(args))
|
||||
argsI := make([]interface{}, len(args))
|
||||
for i := range args {
|
||||
argsFormat[i] = " %.24q"
|
||||
argsI[i] = args[i]
|
||||
}
|
||||
|
||||
argsStr := fmt.Sprintf(strings.Join(argsFormat, ""), argsI...)
|
||||
|
||||
format := `%s [%s%s] %d [%s]`
|
||||
|
||||
if err == nil {
|
||||
l.l.Info(format, remoteAddr, cmd, argsStr, usedTime, "OK")
|
||||
} else {
|
||||
l.l.Info(format, remoteAddr, cmd, argsStr, usedTime, err.Error())
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"github.com/siddontang/ledisdb/ledis"
|
||||
"net"
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
@ -18,6 +19,8 @@ type App struct {
|
|||
|
||||
quit chan struct{}
|
||||
|
||||
access *accessLog
|
||||
|
||||
//for slave replication
|
||||
m *master
|
||||
}
|
||||
|
@ -51,6 +54,18 @@ func NewApp(cfg *Config) (*App, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if len(cfg.AccessLog) > 0 {
|
||||
if path.Dir(cfg.AccessLog) == "." {
|
||||
app.access, err = newAcessLog(path.Join(cfg.DataDir, cfg.AccessLog))
|
||||
} else {
|
||||
app.access, err = newAcessLog(cfg.AccessLog)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if app.ldb, err = ledis.OpenWithConfig(&cfg.DB); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -73,6 +88,10 @@ func (app *App) Close() {
|
|||
|
||||
app.m.Close()
|
||||
|
||||
if app.access != nil {
|
||||
app.access.Close()
|
||||
}
|
||||
|
||||
app.ldb.Close()
|
||||
}
|
||||
|
||||
|
@ -91,6 +110,6 @@ func (app *App) Run() {
|
|||
}
|
||||
}
|
||||
|
||||
func (app *App) Ledis() *ledis.DB {
|
||||
func (app *App) Ledis() *ledis.Ledis {
|
||||
return app.ldb
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var errReadRequest = errors.New("invalid request protocol")
|
||||
|
@ -135,6 +136,8 @@ func (c *client) readRequest() ([][]byte, error) {
|
|||
func (c *client) handleRequest(req [][]byte) {
|
||||
var err error
|
||||
|
||||
start := time.Now()
|
||||
|
||||
if len(req) == 0 {
|
||||
err = ErrEmptyCommand
|
||||
} else {
|
||||
|
@ -152,6 +155,12 @@ func (c *client) handleRequest(req [][]byte) {
|
|||
}
|
||||
}
|
||||
|
||||
duration := time.Since(start)
|
||||
|
||||
if c.app.access != nil {
|
||||
c.app.access.Log(c.c.RemoteAddr().String(), duration.Nanoseconds()/1000000, c.cmd, c.args, err)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
c.writeError(err)
|
||||
}
|
||||
|
|
|
@ -17,6 +17,8 @@ type Config struct {
|
|||
//set slaveof to enable replication from master
|
||||
//empty, no replication
|
||||
SlaveOf string `json:"slaveof"`
|
||||
|
||||
AccessLog string `json:"access_log"`
|
||||
}
|
||||
|
||||
func NewConfig(data json.RawMessage) (*Config, error) {
|
||||
|
|
Loading…
Reference in New Issue