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_sizesock: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 仓库 中找到此模块的其他配置提示和文档。