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

时间:2014-10-07 18:32:14

标签: lua redis jedis

为什么这不打印'你好'?

$ 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 executable。聪明。所以现在我为redis-server,redis-cli interactive和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"

4 个答案:

答案 0 :(得分:11)

面掌掌。终于想通了redis.log(loglevel,message)。这也写入了redis-server的控制台输出。

特别感谢有帮助的匿名选民。你是一个优秀的人。

答案 1 :(得分:2)

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

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

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

另外,不要忘记自动测试,单元和/或集成测试很有用(针对调试redis实例执行)。

答案 2 :(得分:1)

使用jedis,这是你怎么做的.. 这是使用set和get命令的示例.. 你需要在classpath中包含jedis-2.6.0 jar文件。

//jar file - 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("Connection to server sucessfully");
     jedis.set("name", "a");
     System.out.println("Stored string (b4 lua) : "+ jedis.get("name"));
     String script="redis.call('set','name','b')";
     jedis.eval(script);
     System.out.println("Stored string : "+ jedis.get("name"));
}

}

输出: 成功连接到服务器 存储字符串(b4 lua):a 存储的字符串:b

答案 3 :(得分:0)

如果是托管的 Redis 实例。 有时,您无权访问 Redis 的日志文件

所以 redis.log(loglevel, message) 无济于事。

我最终得到了一个有点天真的解决方案,但确实做到了,而且比 OP 在他的问题中所做的更简洁:

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

你可以在LUA脚本的顶部写这个:

local loglist = "log:my_script"
redis.pcall("DEL", loglist) -- Clear the lines list of the previous execution
redis.pcall("EXPIRE", loglist, 300) -- auto-vanish to preserve a space in case forget to delete it 

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 函数中的那一行)。