代码之家  ›  专栏  ›  技术社区  ›  AkshayGupta92

无法从从从HAPRoxy运行的Lua脚本读取/写入文件

  •  0
  • AkshayGupta92  · 技术社区  · 2 年前

    我使用Lua和HAProxy将日志写入自定义日志文件。虽然我的脚本运行得很好。但我没有看到我的文本文件中写的任何内容。

    这是我从HAProxy加载的lua脚本。cfg公司。

    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)
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Himanshu Poddar    2 年前

    简而言之,答案是否定的,当LUA脚本中的方法被HAProxy调用时,您不能使用LUA进行I/O操作。

    来自文档:

    HAProxy是一个事件驱动的软件,因此阻止系统调用是绝对必要的 被禁止的但是,Lua允许执行阻塞操作。当一个动作 块,HAProxy正在等待,什么也不做,所以基本功能如下 在系统结束时,接受连接或转发数据被阻止 呼叫在这种情况下,HAProxy的响应性较差。

    这是非常隐蔽的,因为当开发人员尝试执行其Lua代码时 只有一条溪流,HAProxy似乎运行良好。当代码与一起使用时 在生产流程中,HAProxy遇到了一些缓慢的处理,它不能 保持负载。

    但是,在初始化状态期间,显然可以使用阻塞 功能。通常用于加载文件。

    运行时期间禁止的标准Lua函数列表包含所有 文件系统访问:

    • 操作系统。删除()
    • 操作系统。重命名()
    • 操作系统。tmpname()
    • 包装*()
    • io*()
    • 文件*()

    禁止使用其他一些功能:

    • 操作系统。execute(),等待所需执行阻塞HAProxy的结束。

    • 操作系统。exit(),对进程来说并不太危险,但这不是一个好方法 用于退出HAProxy流程。

    • print(),在标准输出上写入数据。在某些情况下,这些写入是阻塞的 最佳做法是保留此调用以进行调试。我们必须选择 使用core。log()或TXN。用于发送消息的日志()。

    一些HAProxy函数在Lua代码中具有阻塞行为模式,但是 与非阻塞设计兼容。这些功能包括:

    • 所有套接字类
    • 果心睡眠()

    使用核心日志功能在您的案例中进行日志记录。

    果心日志(日志级别,消息)

    此函数发送日志。根据HAProxy配置文件,日志将在默认syslog服务器(如果已配置)上发送。

    参数:

    • loglevel(integer)是与消息关联的日志级别。它是一个介于0和7之间的数字。
    • msg(string)日志内容。

    根据日志的严重性,可以使用以下日志级别。

    日志级别定义

    • 果心紧急情况
    • 果心警觉的
    • 果心暴击
    • 果心犯错误
    • 果心警告
    • 果心注意
    • 果心信息
    • 果心调试

    基于您在haproxy中配置的日志文件。cfg日志将转到相应的文件。

    eg公司

    log /dev/log local6 debug
    

    在本例中,它将所有消息发送到日志设备,并使用local6设置来处理日志。

    rsyslog。conf中有一行代码来处理local6:

    local6.* /var/log/haproxy.log
    

    参考号: