如何从Redis Lua脚本向控制台输出?

为什么这不输出'hello'?

$ redis-cli
127.0.0.1:6379> eval "print( 'hello' )" 0
(nil)
127.0.0.1:6379>

在 Mac OS X 上运行2.8.14,在 Windows 7 上运行2.8.12。

我正在从Jedis调用Lua脚本。开发这些就像戴手套在船瓶中构建一样,同时有人在打我的脸。我的最终目标是通过打印跟踪语句、调试等来重现半功能开发堆栈。

我的解决方法是为我的Lua脚本使用名为'log'的Redis列表,将其返回给Jedis,然后转储内容。有点像这样:

redis.call('del''log')
redis.call('rpush''log''trace statement 1')
redis.call('rpush''log''trace statement 2')

…

redis.call('lrange''log'0-1)

提前感谢任何提示、帮助等。

更新:刚刚注意到'hello'通过redis-server可执行文件的终端窗口输出了。聪明。所以现在我有一个redis-server终端,一个redis-cli交互终端和一个redis-cli监视终端。

更新2:刚刚找到我可以通过以下方式在redis-cli监视器中打印跟踪语句:

eval "redis.call('echo','ugh')"0

看起来有点像这样:

123.456 [0 127.0.0.1:57709] "eval" "redis.call( 'echo', 'ugh')" "0"
123.456 [0 lua] "echo" "ugh"
点赞
用户1371250
用户1371250

我最终发现有 redis.log(loglevel, message) ,它也会写入到redis-server的控制台输出。

2014-10-07 20:13:22
用户2707363
用户2707363

有更好的方法来开发针对 redis 的 LUA 脚本。

使用 lua 日志是一种方法。但是您也可以在调试主题上发布以通过订阅来获取“按需”日志。

您还可以使用带有 lua 断点的 IDE 进行设置,我认为这是开发的最佳解决方案:http://www.trikoder.net/blog/make-lua-debugging-easier-in-redis-87/

此外,不要忘记自动测试,单元测试和/或集成测试非常有帮助(使用调试 redis 实例执行)。

2014-12-09 09:04:59
用户4460309
用户4460309

使用 jedis,下面是如何做的示例..
这是一个使用 set 和 get 命令的示例..
您需要在类路径中包含 jedis-2.6.0 jar 文件。

//jar 文件 - jedis-2.6.0.jar

import redis.clients.jedis.Jedis;
public class MainClass {

    public static void main(String[] args){
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        jedis.set("name", "a");
        System.out.println("存储的字符串(lua 之前): "+ jedis.get("name"));
        String script="redis.call('set','name','b')";
        jedis.eval(script);
        System.out.println("存储的字符串 : "+ jedis.get("name"));
    }

}

输出: 连接成功 存储的字符串(lua 之前): a 存储的字符串 : b

2015-01-28 09:40:55
用户149556
用户149556

在托管 Redis 实例的情况下。有时,您无法访问 Redis 的日志文件。因此 redis.log(loglevel, message) 无法帮助。

我最终采用了一个有点天真的解决方案,但它可以解决问题,并且比 OP 在他的问题中所做的要整洁一些:

您可以在脚本本身中使用 Redis 的一个键来存储整个脚本的日志行(项),例如:

您可以在 LUA 脚本的顶部编写以下内容: `` >>> local loglist = "log:my_script" redis.pcall("DEL", loglist) -- 清除上一个执行的行列表 redis.pcall("EXPIRE", loglist, 300) -- 自动消失以保持空间 (可能会忘记删除它)

local function logme(msg) redis.pcall("RPUSH", loglist, msg) end

- -- 这里是如何在后续脚本中使用它的示例

logme(string.format("reached phase # %d", cur_phase))

在执行完成后检查日志。您可以从 CLI 或任何其他语言客户端列出键行(元素)。
``` >>>
LRANGE "log:my_script" 0 -1
  • 生产环境中不要忘记将它注释掉 (或者至少注释掉 logme 函数内部的那行)。
2021-02-10 13:32:36
用户8034193
用户8034193

尝试一下,将日志记录下来并在返回后打印。

local logtable = {}

local function logit(msg)
  logtable[#logtable+1] = msg
end

logit("foo")
logit("bar")

return logtable
2022-03-08 08:15:47