跳转至

logger-socket: 基于原始套接字的 NGINX 日志库(基于 nginx-module-lua)

安装

如果您尚未设置 RPM 仓库订阅,请 注册。然后您可以继续以下步骤。

CentOS/RHEL 7 或 Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-logger-socket

CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-logger-socket

要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua

本文档描述了 lua-resty-logger-socket v0.1,发布于 2015 年 2 月 18 日。


此 Lua 库是 ngx_lua 的远程日志模块:

http://wiki.nginx.org/HttpLuaModule

其目的是替代 Nginx 的标准 ngx_http_log_module,通过非阻塞套接字将访问日志推送到远程服务器。一个常见的支持套接字的远程日志服务器是 syslog-ng

此 Lua 库利用了 ngx_lua 的 cosocket API,确保 100% 非阻塞行为。

概述

    server {
        location / {
            log_by_lua '
                local logger = require "resty.logger.socket"
                if not logger.initted() then
                    local ok, err = logger.init{
                        host = 'xxx',
                        port = 1234,
                        flush_limit = 1234,
                        drop_limit = 5678,
                    }
                    if not ok then
                        ngx.log(ngx.ERR, "failed to initialize the logger: ",
                                err)
                        return
                    end
                end

                -- 在 Lua 变量 "msg" 中构造自定义访问日志消息

                local bytes, err = logger.log(msg)
                if err then
                    ngx.log(ngx.ERR, "failed to log message: ", err)
                    return
                end
            ';
        }
    }

方法

此日志模块旨在由 Nginx 工作进程中的所有请求共享。因此,目前仅支持一个远程日志服务器。我们可能在未来支持多个日志服务器分片。

init

语法: ok, err = logger.init(user_config)

使用用户配置初始化日志记录器。此日志记录器必须在使用之前初始化。如果您未初始化日志记录器,将会出现错误。

可用的用户配置如下所示:

  • flush_limit

    如果缓冲消息的大小加上当前消息的大小达到(>=)此限制(以字节为单位),则缓冲的日志消息将被写入日志服务器。默认值为 4096(4KB)。

  • drop_limit

    如果缓冲消息的大小加上当前消息的大小大于此限制(以字节为单位),则由于缓冲区大小限制,当前日志消息将被丢弃。默认的 drop_limit 为 1048576(1MB)。

  • timeout

    设置后续操作的超时(以毫秒为单位)保护,包括 connect 方法。默认值为 1000(1 秒)。

  • host

    日志服务器主机。

  • port

    日志服务器端口号。

  • path

    如果日志服务器使用流类型的 Unix 域套接字,path 是套接字文件路径。请注意,host/port 和 path 不能同时为空。至少必须提供一个。

  • max_retry_times

    在连接到日志服务器失败或发送日志消息到日志服务器失败后,最大重试次数。

  • retry_interval

    连接到日志服务器或重试发送日志消息到日志服务器之前的时间延迟(以毫秒为单位),默认值为 100(0.1 秒)。

  • pool_size

    sock:keepalive 使用的保持活动连接池大小。默认值为 10。

  • max_buffer_reuse

    在创建新缓冲区之前,内部日志缓冲区的最大重用次数(以防止内存泄漏)。

  • periodic_flush

    定期刷新间隔(以秒为单位)。设置为 nil 以关闭此功能。

  • ssl

    布尔值,启用或禁用通过 SSL 连接。默认值为 false。

  • ssl_verify

    布尔值,启用或禁用验证主机和证书匹配。默认值为 true。

  • sni_host

    设置在 SNI 中发送的主机名,并在验证证书匹配时使用。

initted

语法: initted = logger.initted()

获取一个布尔值,指示此模块是否已通过调用 init 方法进行初始化。

log

语法: bytes, err = logger.log(msg)

记录一条消息。默认情况下,日志消息将缓存在日志记录器模块中,直到达到 flush_limit,此时日志记录器将通过套接字将所有缓冲的消息刷新到远程日志服务器。 bytes 是成功缓存在日志记录器中的字节数。如果 bytes 为 nil,则 err 是描述此时发生的错误类型的字符串。如果 bytes 不是 nil,则 err 是之前的错误消息。当 bytes 不是 nil 时,err 可以是 nil。

flush

语法: bytes, err = logger.flush()

立即将任何缓冲的消息刷新到远程。通常您不需要手动调用此方法,因为当缓冲区满时会自动刷新。

GitHub

您可以在 nginx-module-logger-socket 的 GitHub 仓库 中找到此模块的其他配置提示和文档。