无法从 HAPROxy read/write 从 Lua 脚本 运行 提交文件
Unable to read/write to file from Lua script running from HAPRoxy
我使用 Lua 和 HAProxy 将日志写入自定义日志文件。尽管我的脚本 运行 完全没问题。但是我在我的文本文件中没有看到任何内容。
这是我从 HAProxy.cfg.
加载的 lua 脚本
local function foo(value)
-- MY CODE --
file = io.open("test.lua", "a")
io.output(file)
io.write("The value of member variable archiver is " .. o_archiver)
io.close(file)
end
core.register_converters("foo_conv", foo)
简短的回答是否定的,当 HAProxy 调用 Lua 脚本中的方法时,您不能使用 LUA 执行 I/O 操作。
来自文档:
HAProxy是一个事件驱动的软件,所以阻塞系统调用是绝对的
禁止。但是,Lua 允许执行阻止操作。当一个动作
块,HAProxy 正在等待并且什么也不做,所以基本功能如
在系统结束时接受连接或转发数据被阻止
称呼。在这种情况下,HAProxy 的响应速度会降低。
这非常阴险,因为当开发人员试图执行其 Lua 代码时
只有一个流,HAProxy 似乎 运行 没问题。当代码与
production stream,HAProxy 遇到了一些慢处理,它不能
保持负载。
然而,在初始化状态下,你显然可以使用阻塞
职能。通常用于加载文件。
在 运行 时间内禁止的标准 Lua 函数列表包含所有
进行文件系统访问:
- os.remove()
- os.rename()
- os.tmpname()
- 包.*()
- io.*()
- 文件.*()
其他一些功能被禁止:
os.execute(),等待要求的执行结束阻塞HAProxy。
os.exit(),对进程来说不是很危险,但不是好方法
用于退出 HAProxy 进程。
print(),将数据写入标准输出。在某些情况下,这些写入是阻塞的,
最佳做法是保留此调用以进行调试。我们必须更喜欢
使用 core.log() 或 TXN.log() 发送消息。
某些 HAProxy 函数在 Lua 代码中具有阻塞行为模式,但是
有兼容的非阻塞设计。这些函数是:
- 全部插座class
- core.sleep()
在您的案例中使用核心日志功能进行日志记录。
core.log(loglevel, msg)
此函数发送日志。日志根据 HAProxy 配置文件发送到默认的系统日志服务器(如果已配置)。
参数:
- loglevel(整数)- 是与消息关联的日志级别。它是一个介于 0 和 7 之间的数字。
- msg (string) – 日志内容。
根据日志的严重程度,您可以使用以下日志级别。
日志级别定义
- core.emerg
- core.alert
- core.crit
- core.err
- core.warning
- core.notice
- core.info
- core.debug
根据您在 haproxy.cfg 中配置的日志文件,日志将转到相应的文件。
例如
log /dev/log local6 debug
在此示例中,它将所有消息发送到日志设备并使用 local6 设置来处理日志。
rsyslog.conf 中会有一行来处理 local6:
local6.* /var/log/haproxy.log
参考:
我使用 Lua 和 HAProxy 将日志写入自定义日志文件。尽管我的脚本 运行 完全没问题。但是我在我的文本文件中没有看到任何内容。
这是我从 HAProxy.cfg.
加载的 lua 脚本local function foo(value)
-- MY CODE --
file = io.open("test.lua", "a")
io.output(file)
io.write("The value of member variable archiver is " .. o_archiver)
io.close(file)
end
core.register_converters("foo_conv", foo)
简短的回答是否定的,当 HAProxy 调用 Lua 脚本中的方法时,您不能使用 LUA 执行 I/O 操作。
来自文档:
HAProxy是一个事件驱动的软件,所以阻塞系统调用是绝对的 禁止。但是,Lua 允许执行阻止操作。当一个动作 块,HAProxy 正在等待并且什么也不做,所以基本功能如 在系统结束时接受连接或转发数据被阻止 称呼。在这种情况下,HAProxy 的响应速度会降低。
这非常阴险,因为当开发人员试图执行其 Lua 代码时 只有一个流,HAProxy 似乎 运行 没问题。当代码与 production stream,HAProxy 遇到了一些慢处理,它不能 保持负载。
然而,在初始化状态下,你显然可以使用阻塞 职能。通常用于加载文件。
在 运行 时间内禁止的标准 Lua 函数列表包含所有 进行文件系统访问:
- os.remove()
- os.rename()
- os.tmpname()
- 包.*()
- io.*()
- 文件.*()
其他一些功能被禁止:
os.execute(),等待要求的执行结束阻塞HAProxy。
os.exit(),对进程来说不是很危险,但不是好方法 用于退出 HAProxy 进程。
print(),将数据写入标准输出。在某些情况下,这些写入是阻塞的, 最佳做法是保留此调用以进行调试。我们必须更喜欢 使用 core.log() 或 TXN.log() 发送消息。
某些 HAProxy 函数在 Lua 代码中具有阻塞行为模式,但是 有兼容的非阻塞设计。这些函数是:
- 全部插座class
- core.sleep()
在您的案例中使用核心日志功能进行日志记录。
core.log(loglevel, msg)
此函数发送日志。日志根据 HAProxy 配置文件发送到默认的系统日志服务器(如果已配置)。
参数:
- loglevel(整数)- 是与消息关联的日志级别。它是一个介于 0 和 7 之间的数字。
- msg (string) – 日志内容。
根据日志的严重程度,您可以使用以下日志级别。
日志级别定义
- core.emerg
- core.alert
- core.crit
- core.err
- core.warning
- core.notice
- core.info
- core.debug
根据您在 haproxy.cfg 中配置的日志文件,日志将转到相应的文件。
例如
log /dev/log local6 debug
在此示例中,它将所有消息发送到日志设备并使用 local6 设置来处理日志。
rsyslog.conf 中会有一行来处理 local6:
local6.* /var/log/haproxy.log
参考: