无法从 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

参考: