From 10877e9a0783f9d8a1f7503f6e428884014c4b23 Mon Sep 17 00:00:00 2001 From: Dirk Moermans Date: Mon, 11 Oct 2021 11:54:21 +0200 Subject: [PATCH] add redis logger --- cmd_scripting.go | 5 ++++- cmd_scripting_test.go | 11 +++++++++++ lua.go | 27 +++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/cmd_scripting.go b/cmd_scripting.go index 99b87215..ef10aaef 100644 --- a/cmd_scripting.go +++ b/cmd_scripting.go @@ -80,10 +80,13 @@ func (m *Miniredis) runLuaScript(c *server.Peer, script string, args []string) b } l.SetGlobal("ARGV", argvTable) - redisFuncs := mkLuaFuncs(m.srv, c) + redisFuncs, redisConstants := mkLua(m.srv, c) // Register command handlers l.Push(l.NewFunction(func(l *lua.LState) int { mod := l.RegisterModule("redis", redisFuncs).(*lua.LTable) + for k, v := range redisConstants { + mod.RawSetString(k, v) + } l.Push(mod) return 1 })) diff --git a/cmd_scripting_test.go b/cmd_scripting_test.go index bc5ec25c..a7786662 100644 --- a/cmd_scripting_test.go +++ b/cmd_scripting_test.go @@ -226,6 +226,17 @@ func TestCJSON(t *testing.T) { ) } +func TestLog(t *testing.T) { + s, err := Run() + ok(t, err) + defer s.Close() + c, err := proto.Dial(s.Addr()) + ok(t, err) + defer c.Close() + mustNil(t, c, + "EVAL", "redis.log(redis.LOG_NOTICE, 'hello')", "0") +} + func TestSha1Hex(t *testing.T) { s, err := Run() ok(t, err) diff --git a/lua.go b/lua.go index 7a99252f..6bfb869e 100644 --- a/lua.go +++ b/lua.go @@ -11,7 +11,14 @@ import ( "github.com/alicebob/miniredis/v2/server" ) -func mkLuaFuncs(srv *server.Server, c *server.Peer) map[string]lua.LGFunction { +var luaRedisConstants = map[string]lua.LValue{ + "LOG_DEBUG": lua.LNumber(0), + "LOG_VERBOSE": lua.LNumber(1), + "LOG_NOTICE": lua.LNumber(2), + "LOG_WARNING": lua.LNumber(3), +} + +func mkLua(srv *server.Server, c *server.Peer) (map[string]lua.LGFunction, map[string]lua.LValue) { mkCall := func(failFast bool) func(l *lua.LState) int { // one server.Ctx for a single Lua run pCtx := &connCtx{} @@ -107,6 +114,22 @@ func mkLuaFuncs(srv *server.Server, c *server.Peer) map[string]lua.LGFunction { l.Push(res) return 1 }, + "log": func(l *lua.LState) int { + v := l.Get(1) + level, ok := v.(lua.LNumber) + if !ok { + l.Error(lua.LString("wrong type for the level"), 1) + return 0 + } + v = l.Get(2) + msg, ok := v.(lua.LString) + if !ok { + l.Error(lua.LString("wrong number or type of arguments"), 1) + return 0 + } + fmt.Printf("%v: %v", level, msg) + return 0 + }, "status_reply": func(l *lua.LState) int { v := l.Get(1) msg, ok := v.(lua.LString) @@ -133,7 +156,7 @@ func mkLuaFuncs(srv *server.Server, c *server.Peer) map[string]lua.LGFunction { // ignored return 1 }, - } + }, luaRedisConstants } func luaToRedis(l *lua.LState, c *server.Peer, value lua.LValue) {