gpt4 book ai didi

c - 使用 Lua 进行日志记录....多次调用 luaL_openlibs 是一件坏事吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:02 25 4
gpt4 key购买 nike

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

注意:我根本不是 Lua 专家,但我正在尽我最大的努力尽快到达那里 ;-) 请耐心等待......

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

显然我应该有一个“构造函数”,它被称为“luaL_newstate”、“luaL_openlibs”的 ONCE,然后是“lua_close”的某种“析构函数”。

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

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

感谢您的帮助;-)

林顿

最佳答案

你的问题确实与Lua无关。它实际上是关于如何用 C 语言组合一个需要在某个时刻初始化的全局系统,然后在程序退出时关闭。

我不是 C 专家,但我的方法是拥有一对文件,log_system.hlog_system.clog_system.h 将具有记录消息的功能、初始化系统的功能和取消初始化的功能。然后,日志系统的用户将需要在程序开始时初始化系统,并在程序结束时取消初始化。

初始化函数会设置一个lua_State 并将其存储在一个static 全局变量中。 deinitialize 函数将关闭静态 lua_State。日志记录功能将检查 lua_State,如果它有效(即:非 NULL。系统已初始化且未取消初始化),它将通过 Lua 执行任何必要的日志记录。

还有其他替代方案,比如让初始化函数返回一个完整的对象,它代表日志系统的一个实例。这个对象将是一个不透明的指针(用于数据隐藏目的)指向一个包含 lua_State 的内部结构(或者它可以只返回一个 void* 恰好是一个 lua_State,但我更喜欢不透明结构的可扩展性)。

在这种情况下,用户将负责将该对象保存在任何需要的地方,以便进行适当的日志记录。

哦,顺便说一句,您在您的应用程序中引入了一个巨大安全漏洞。 test_log.lua 可以由用户随意替换。由于您在该 Lua 状态下打开所有 Lua 库,它们可以自由地将文件写入任何他们想要的地方。

我建议在这里做一些合理的封装。删除所有涉及文件的 Lua 函数(dofileloadfilerequire 等)。或者,或者 test_log.lua 不应该是一个外部文件;它应该是内置在您的可执行文件中的东西。这可以作为内部可执行资源,也可以作为静态全局 char* 某处

关于c - 使用 Lua 进行日志记录....多次调用 luaL_openlibs 是一件坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com