如何在 Redis Lua 脚本中将内容输出到控制台?

14
为什么这段代码没有输出 '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"
5个回答

19

我终于弄清楚了,原来有redis.log(loglevel, message)方法,它可以将日志信息写入redis服务器的控制台输出。


7
我最近发布了一系列有助于跟踪和调试Redis中Lua的方法 - 希望能有所帮助 :) https://redislabs.com/blog/5-methods-for-tracing-and-debugging-redis-lua-scripts - Itamar Haber
1
redis.log(redis.LOG_DEBUG, "example text") - fionbio

3
有更好的方法来开发针对redis的LUA脚本。
使用lua日志是一种方式。但您还可以发布调试主题,通过订阅它来获取“按需”日志。
您还可以设置带有lua断点的IDE,我认为这是开发的最佳解决方案:http://www.trikoder.net/blog/make-lua-debugging-easier-in-redis-87/ 此外,不要忘记自动测试,单元测试和/或集成测试都是有帮助的(在调试redis实例上执行)。

2

在托管的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函数内部的那行代码)。

1

使用Jedis,您可以这样做... 这是一个使用set和get命令的示例... 您需要将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


这个问题是在问如何从脚本向控制台写入内容。这个答案只使用Java的控制台输出(System.out.println)来写入控制台输出。 - Brandon

1

试试这个,它会记录日志并在返回后打印。

local logtable = {}
 
local function logit(msg)
  logtable[#logtable+1] = msg
end
 
logit("foo")
logit("bar")
 
return logtable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接