Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Redis Lua脚本输出到控制台?_Redis_Lua - Fatal编程技术网

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

如何从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列表,将其返回给绝地

为什么不打印“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.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函数中的行)

我最近发布了这组方法,这些方法都旨在帮助在Redis中跟踪和调试Lua-希望有帮助:)