我想在我的C应用程序中嵌入一些Lua脚本.....专门用于LOGGING。我之前使用过LOG4C但实际上更喜欢“Lua Logging”....
注意:我不是Lua专家,但我很快就会尽力到达那里;-)请耐心等待...
现在我想知道最好的方法是...这意味着我想记录许多事件并每秒处理大约15-20条消息,每条消息可能会有40条日志消息。所以,如果我为每条消息调用一个C函数进行记录,然后对于每个函数调用,我执行“luaL_newstate”,“luaL_openlibs”和“lua_close”是不是很糟糕?它似乎是,但Lua是如此轻量级,我很想知道它是否那么糟糕?
显然我应该有一个“构造函数”,它被称为ONCE,用于“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构造函数”,那么请你给我看一小段代码,告诉我这个“日志记录过程”在最好的情况下应该如何工作?
感谢您的帮助; - )
林顿
答案 0 :(得分:2)
你的问题与Lua没什么关系。它实际上是关于如何在C中组合一个需要在某个时刻进行初始化的全局系统,然后在程序退出时关闭。
我不是C专家,但我这样做的方法是拥有一对文件log_system.h
和log_system.c
。 log_system.h
将具有记录消息的功能,初始化系统的功能以及取消初始化它的功能。然后,日志系统的用户需要在程序开始时初始化系统并在结束时取消初始化。
初始化函数将设置lua_State
并将其存储在静态全局变量中。 deinitialize函数将关闭静态lua_State
。日志记录功能将检查lua_State
,如果它是有效的(即:非NULL。系统已初始化而未取消初始化),它将执行任何通过Lua进行的记录是必要的。
还有其他选择,比如初始化函数返回一个完整的对象,它代表了日志记录系统的一个实例。这个对象是一个不透明的指针(用于数据隐藏目的)到包含lua_State
的内部结构(或者它只能返回恰好是void*
的{{1}},但我我更喜欢不透明结构的可扩展性。
在这种情况下,用户将负责将该对象保留在需要的任何位置,以便进行适当的日志记录。
哦,顺便说一句,您在应用程序中引入了大量安全漏洞。用户可以将lua_State
替换为其内容。而且,由于您在Lua状态下打开了所有 Lua库,因此可以随意将文件写入任何他们想要的地方。
我建议在这里做一些合理的封装。摆脱触及文件的所有函数Lua函数(test_log.lua
,dofile
,loadfile
等)。要么是,要么require
不应该是外部文件;它应该是你的可执行文件中内置的东西。这可以作为内部可执行资源,也可以作为静态全局test_log.lua
某处