Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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
C 使用Lua进行日志记录……多次调用luaL_openlibs是件坏事吗?_C_Lua - Fatal编程技术网

C 使用Lua进行日志记录……多次调用luaL_openlibs是件坏事吗?

C 使用Lua进行日志记录……多次调用luaL_openlibs是件坏事吗?,c,lua,C,Lua,我想在我的C应用程序中嵌入一些Lua脚本……专门用于日志记录。我以前使用过LOG4C,但实际上我更喜欢“Lua日志” 注意:我根本不是Lua专家,但我正在尽最大努力尽快到达那里;-)请容忍我 现在我想知道最好的方法是什么…这意味着我想记录许多事件,每秒处理大约15-20条消息,每个消息可能有40条日志消息。所以,如果我为每个要记录的消息调用一个C函数,然后为每个函数调用一个“luaL_newstate”、“luaL_openlibs”和“lua_close”,这是不是很糟糕?看起来是这样的,但L

我想在我的C应用程序中嵌入一些Lua脚本……专门用于日志记录。我以前使用过LOG4C,但实际上我更喜欢“Lua日志”

注意:我根本不是Lua专家,但我正在尽最大努力尽快到达那里;-)请容忍我

现在我想知道最好的方法是什么…这意味着我想记录许多事件,每秒处理大约15-20条消息,每个消息可能有40条日志消息。所以,如果我为每个要记录的消息调用一个C函数,然后为每个函数调用一个“luaL_newstate”、“luaL_openlibs”和“lua_close”,这是不是很糟糕?看起来是这样的,但Lua是如此轻巧和快速,我想知道它是否那么糟糕

很明显,我更希望有一个“构造函数”,它只为“luaL_newstate”、“luaL_openlibs”调用一次,然后为“lua_close”调用某种“析构函数”

你能告诉我这里最好的解决方案是什么吗?也就是说,如果你说我必须使用“Lua构造函数”,你能给我看一小段代码,告诉我这个“日志记录过程”在最佳情况下应该如何工作吗

谢谢你的帮助;-)


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);