使用 Lua 进行记录...调用 luaL_openlibs 多次会有什么坏处吗?

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

注意:我根本不是Lua专家,但正在尽力尝试掌握;-)请耐心等待...

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

显然,我应该有一个“构造函数”,它仅调用一次“luaL_newstate”,“luaL_openlibs”,然后有一个“析构函数”用于“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构造函数”,那么您可以向我展示一小段代码片段,以展示最佳情况下的“日志记录”应该如何工作吗?

感谢您的帮助;-)

Lynton

原文链接 https://stackoverflow.com/questions/7999492

点赞
stackoverflow用户734069
stackoverflow用户734069

将下面翻译成中文并且保留原本的 markdown 格式

你的问题与 Lua 其实并没有太大关系,它实际上是关于如何在 C 中组合一个需要在某些时间点初始化并在程序退出时关闭的全局系统。

虽然我不是 C 专家,但我会这样做:创建一个名为 log_system.hlog_system.c 的文件对。log_system.h 文件会包括一个记录消息的函数、一个初始化系统的函数和一个反初始化系统的函数。日志系统的用户将需要在程序开始时初始化系统,并在程序结束时反初始化系统。

初始化函数将设置一个 lua_State 并将其存储在一个 静态 全局变量中。反初始化函数将关闭这个静态 lua_State。记录日志的函数将检查 lua_State 并确定其是否有效(即非空)。如果系统已经被初始化并且没有反初始化,它会执行必要的 Lua 记录日志操作。

还有其他选择,比如初始化函数返回一个完全成熟的对象,该对象代表日志系统的一个实例。这个对象将是一个不透明指针(用于数据隐藏目的),指向包含 lua_State 的内部结构体(或者它可能只是返回一个指向 lua_Statevoid*,但我更喜欢不透明结构的可扩展性)。

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

还有一件事,你的应用程序中存在一个 巨大的 安全漏洞。test_log.lua 可以被用户随心所欲地替换。而且,由于你在这个 Lua 状态下打开了 所有 Lua 库,因此用户可以自由地将文件写入任何他们想要的地方。

我建议在这里进行合理的封装。消除所有涉及到文件的 Lua 函数(dofileloadfilerequire 等)。或者,test_log.lua 应该不是一个外部文件;它应该是嵌入到应用程序中的某个东西。它可以是一种内部可执行资源,也可以只是某个静态全局 char*

2011-11-03 18:14:35