使用 Lua 进行记录...调用 luaL_openlibs 多次会有什么坏处吗?
2011-11-3 18:5:28
收藏:0
阅读:119
评论:1
我想在我的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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
将下面翻译成中文并且保留原本的 markdown 格式
你的问题与 Lua 其实并没有太大关系,它实际上是关于如何在 C 中组合一个需要在某些时间点初始化并在程序退出时关闭的全局系统。
虽然我不是 C 专家,但我会这样做:创建一个名为
log_system.h
和log_system.c
的文件对。log_system.h
文件会包括一个记录消息的函数、一个初始化系统的函数和一个反初始化系统的函数。日志系统的用户将需要在程序开始时初始化系统,并在程序结束时反初始化系统。初始化函数将设置一个
lua_State
并将其存储在一个 静态 全局变量中。反初始化函数将关闭这个静态lua_State
。记录日志的函数将检查lua_State
并确定其是否有效(即非空)。如果系统已经被初始化并且没有反初始化,它会执行必要的 Lua 记录日志操作。还有其他选择,比如初始化函数返回一个完全成熟的对象,该对象代表日志系统的一个实例。这个对象将是一个不透明指针(用于数据隐藏目的),指向包含
lua_State
的内部结构体(或者它可能只是返回一个指向lua_State
的void*
,但我更喜欢不透明结构的可扩展性)。在这种情况下,用户将负责将该对象保留在需要进行适当记录日志的地方。
还有一件事,你的应用程序中存在一个 巨大的 安全漏洞。
test_log.lua
可以被用户随心所欲地替换。而且,由于你在这个 Lua 状态下打开了 所有 Lua 库,因此用户可以自由地将文件写入任何他们想要的地方。我建议在这里进行合理的封装。消除所有涉及到文件的 Lua 函数(
dofile
、loadfile
、require
等)。或者,test_log.lua
应该不是一个外部文件;它应该是嵌入到应用程序中的某个东西。它可以是一种内部可执行资源,也可以只是某个静态全局char*
。