C 使用Lua进行日志记录……多次调用luaL_openlibs是件坏事吗?
我想在我的C应用程序中嵌入一些Lua脚本……专门用于日志记录。我以前使用过LOG4C,但实际上我更喜欢“Lua日志” 注意:我根本不是Lua专家,但我正在尽最大努力尽快到达那里;-)请容忍我 现在我想知道最好的方法是什么…这意味着我想记录许多事件,每秒处理大约15-20条消息,每个消息可能有40条日志消息。所以,如果我为每个要记录的消息调用一个C函数,然后为每个函数调用一个“luaL_newstate”、“luaL_openlibs”和“lua_close”,这是不是很糟糕?看起来是这样的,但Lua是如此轻巧和快速,我想知道它是否那么糟糕 很明显,我更希望有一个“构造函数”,它只为“luaL_newstate”、“luaL_openlibs”调用一次,然后为“lua_close”调用某种“析构函数” 你能告诉我这里最好的解决方案是什么吗?也就是说,如果你说我必须使用“Lua构造函数”,你能给我看一小段代码,告诉我这个“日志记录过程”在最佳情况下应该如何工作吗 谢谢你的帮助;-)C 使用Lua进行日志记录……多次调用luaL_openlibs是件坏事吗?,c,lua,C,Lua,我想在我的C应用程序中嵌入一些Lua脚本……专门用于日志记录。我以前使用过LOG4C,但实际上我更喜欢“Lua日志” 注意:我根本不是Lua专家,但我正在尽最大努力尽快到达那里;-)请容忍我 现在我想知道最好的方法是什么…这意味着我想记录许多事件,每秒处理大约15-20条消息,每个消息可能有40条日志消息。所以,如果我为每个要记录的消息调用一个C函数,然后为每个函数调用一个“luaL_newstate”、“luaL_openlibs”和“lua_close”,这是不是很糟糕?看起来是这样的,但L
Lynton你的问题实际上与Lua无关。它实际上是关于如何用C语言构建一个全局系统,该系统需要在某个时候初始化,然后在程序退出时关闭 我不是C专家,但我会做的是有一对文件,
log\u system.h
和log\u system.C
。log\u system.h
将有一个记录消息的功能,一个初始化系统的功能,还有一个去初始化它的功能。然后,日志系统的用户将被要求初始化系统在程序开始时退出,并在程序结束时取消初始化
初始化函数将设置一个lua\u状态
,并将其存储在一个静态全局变量中。反初始化函数将关闭静态lua\u状态
。日志函数将检查lua\u状态
,以及它是否有效(即:非空。系统已初始化且未反初始化),它将执行任何需要通过Lua进行日志记录的操作
还有其他替代方法,如使用initialize函数返回的完整对象,该对象表示日志系统的实例。该对象是指向包含lua\u状态的内部结构的不透明指针(用于数据隐藏)(或者它可以返回一个正好是lua_状态的void*
,但我更喜欢不透明结构的扩展性)
在这种情况下,用户将负责将该对象保留在任何需要的地方,以便进行适当的日志记录
哦,顺便说一句,您在应用程序中引入了一个巨大的安全漏洞。test\u log.lua
可以被用户完全替换。而且,由于您在该lua状态下打开了所有lua库,用户可以自由地将文件写入任何他们想要的位置
我建议在这里做一些合理的封装。去掉所有与文件相关的函数(dofile
,loadfile
,require
,等等)。或者,test\u log.lua
不应该是一个外部文件;它应该是内置在您的可执行文件中的东西。这可以是一个内部可执行资源,也可以是一个静态全局char*
的某个地方您好,谢谢您的回答,非常感谢!2件事……假设一个程序可以全天候运行,并且没有任何错误Don’不要停止……卢亚斯塔特变得“腐败”是“普通”吗“我需要重新打开它,等等?我希望它是非常稳定的….至少我已经看到Lua一般是….第二件事,我同意安全漏洞,谢谢….如果我在char*变量中有Lua代码,我如何使用doFile之类的东西在char*中执行Lua脚本?它们像“doBuffer”还是类似的东西?
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
...
...
if (luaL_loadfile(L, "test_log.lua"))
bail(L, "luaL_loadfile() failed");
if (lua_pcall(L, 0, 0, 0))
bail(L, "lua_pcall() failed");
lua_getglobal(L, "writeLog");
lua_pushstring(L, buffer);
if (lua_pcall(L, 1, 1, 0))
bail(L, "lua_pcall() failed");
int result = lua_tonumber(L, -1);
....
lua_close(L);