如何从Redis Lua脚本输出到控制台?
为什么不打印“hello”如何从Redis Lua脚本输出到控制台?,redis,lua,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 我在给绝地武士的卢亚剧本打电话。开发这些就像建造一艘船一个瓶子,戴着手套,而有人在打我的脸。我的最终目标是通过打印跟踪语句、调试等方式重新创建一个半功能开发堆栈 我的解决方法是使用一个名为“日志”的Redis列表,将其返回给绝地
$ 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
我在给绝地武士的卢亚剧本打电话。开发这些就像建造一艘船一个瓶子,戴着手套,而有人在打我的脸。我的最终目标是通过打印跟踪语句、调试等方式重新创建一个半功能开发堆栈
我的解决方法是使用一个名为“日志”的Redis列表,将其返回给绝地,然后转储内容。有点像这样:
redis.call( 'del', 'log' )
redis.call( 'rpush', 'log', 'trace statement 1' )
redis.call( 'rpush', 'log', 'trace statement 2' )
...
redis.call( 'lrange', 'log', 0, -1 )
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"
提前感谢您提供的任何提示、帮助等
更新:刚刚注意到“hello”确实通过redis server可执行文件的终端窗口输出。聪明。现在我为redis server、redis cli interactive和redis cli monitor分别安装了一个终端
更新2:我发现我可以像这样将跟踪语句打印到redis cli监视器上:
redis.call( 'del', 'log' )
redis.call( 'rpush', 'log', 'trace statement 1' )
redis.call( 'rpush', 'log', 'trace statement 2' )
...
redis.call( 'lrange', 'log', 0, -1 )
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"
看起来有点像这样:
redis.call( 'del', 'log' )
redis.call( 'rpush', 'log', 'trace statement 1' )
redis.call( 'rpush', 'log', 'trace statement 2' )
...
redis.call( 'lrange', 'log', 0, -1 )
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"
我终于发现了redis.log(loglevel,message),它也会写入redis服务器的控制台输出。有更好的方法针对redis开发LUA脚本 使用lua日志是一种方法。但您也可以通过订阅调试主题来发布“按需”日志 您还可以使用lua断点设置IDE,我认为这是开发的最佳解决方案:
另外,别忘了自动测试、单元测试和/或集成测试都很有帮助(针对debug redis实例执行)。使用jedis,下面是如何做到这一点的。。 这是一个使用set和get命令的示例。。 您需要在类路径中包含jedis-2.6.0jar文件
//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
存储字符串:对于托管的Redis实例,为b有时,您无法访问Redis的日志文件 所以
redis.log(loglevel,message)
不会有帮助
我最终提出了一个有点幼稚的解决方案,但确实做到了这一点,而且比OP在他的问题中所做的更简洁:
您可以使用Redis it self的键在脚本本身中存储整个脚本执行的日志行(项):
您可以在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
- 不要忘记在PRODUCTION ENV上注释它(或者至少是logme函数中的行)