Nginx RTMP 日志模块分析 (ngx_rtmp_log_module.c)
ngx_rtmp_log_module.c 代码是 Nginx RTMP 模块中的日志模块,主要用于记录 RTMP 流会话中的各类操作和事件。通过配置,用户可以定制 RTMP 服务器的日志输出,包括客户端连接、流发布、播放、断开等信息的日志记录。该模块支持灵活的日志格式,并允许将日志输出到指定文件。
以下是该模块的详细分析:
1. 日志操作和配置
1.1 ngx_rtmp_log_op_t
结构体
ngx_rtmp_log_op_t
是一个日志操作的结构体,它描述了如何从 RTMP 会话中提取和生成日志信息。
-
getlen
:一个函数指针,指向获取该日志项长度的函数。 -
getdata
:一个函数指针,指向从 RTMP 会话中提取数据并填充到缓冲区的函数。 -
value
:存储日志项的静态值。 -
offset
:指示日志项在结构体中的偏移位置。
1.2 ngx_rtmp_log_var_t
结构体
ngx_rtmp_log_var_t
用于定义具体的日志变量,例如客户端地址、命令类型等,包含:
-
name
:日志变量的名称。 -
getlen
:获取日志变量长度的函数指针。 -
getdata
:从 RTMP 会话中提取数据的函数指针。 -
offset
:指向该数据的偏移量。
1.3 ngx_rtmp_log_fmt_t
结构体
ngx_rtmp_log_fmt_t
代表日志的格式,它包含:
-
name
:格式的名称。 -
ops
:日志项操作的数组(ngx_rtmp_log_op_t
类型)。
1.4 ngx_rtmp_log_t
结构体
ngx_rtmp_log_t
表示一个日志实例,包含:
-
file
:日志文件的指针。 -
disk_full_time
:记录磁盘满的时间。 -
error_log_time
:记录上次写入日志错误的时间。 -
format
:日志格式。
1.5 ngx_rtmp_log_app_conf_t
结构体
ngx_rtmp_log_app_conf_t
存储每个应用的日志配置:
-
logs
:存储日志配置的数组。 -
off
:表示日志是否关闭。
1.6 ngx_rtmp_log_main_conf_t
结构体
ngx_rtmp_log_main_conf_t
存储全局的日志配置:
-
formats
:存储不同日志格式的数组。 -
combined_used
:标志是否使用了常见的日志格式(combined
)。
2. 配置指令
2.1 ngx_rtmp_log_commands
该数组包含两个配置指令:
-
access_log
:设置日志输出的文件路径和格式。 -
log_format
:设置日志的格式。
2.2 ngx_rtmp_log_set_log
函数
这个函数负责解析 access_log
指令:
-
通过
ngx_conf_open_file
打开日志文件。 -
配置日志格式。
-
支持关闭日志(通过
off
参数)。
2.3 ngx_rtmp_log_set_format
函数
该函数用于解析 log_format
指令,允许用户设置自定义的日志格式。日志格式的配置是基于变量(如 $remote_addr
、$time_local
等)来动态构建的。
2.4 ngx_rtmp_log_compile_format
函数
用于编译日志格式,解析日志格式字符串并将其转换为可执行的操作(如提取远程地址、时间戳、命令等)。
3. 日志处理函数
3.1 ngx_rtmp_log_write
函数
ngx_rtmp_log_write
用于将日志数据写入文件:
-
它会将格式化后的日志条目写入到指定的日志文件。
-
如果磁盘已满,记录日志的时间。
-
会检查写入操作是否成功,如果失败则记录错误。
3.2 ngx_rtmp_log_set_names
函数
此函数将流会话的名称和参数存储在 ngx_rtmp_log_ctx_t
中。它用于在流发布或播放时设置相关的日志信息。
3.3 ngx_rtmp_log_publish
和 ngx_rtmp_log_play
函数
这两个函数分别在流发布和播放时被调用:
-
在发布和播放时,调用
ngx_rtmp_log_set_names
设置流的名称和参数。 -
设置相关的标志(
publish
和play
),然后继续调用下一个处理函数(如next_publish
和next_play
)。
3.4 ngx_rtmp_log_disconnect
函数
当客户端断开连接时,ngx_rtmp_log_disconnect
会被调用:
-
它会记录与该会话相关的日志数据(如连接、命令、传输字节数等)。
-
支持不同的日志格式输出,包括时间戳、客户端地址、命令类型等信息。
4. 日志格式定义与使用
4.1 ngx_rtmp_combined_fmt
这是一个默认的日志格式,记录了客户端的 IP 地址、时间戳、命令类型、流名称、请求参数、传输字节数等信息。
4.2 ngx_rtmp_log_var_*
函数
这些函数负责从 RTMP 会话中提取不同的变量数据,例如:
-
ngx_rtmp_log_var_connection_getdata
:获取连接的唯一标识。 -
ngx_rtmp_log_var_remote_addr_getdata
:获取客户端的 IP 地址。 -
ngx_rtmp_log_var_command_getdata
:获取 RTMP 命令类型(如播放、发布)。 -
ngx_rtmp_log_var_session_time_getdata
:获取会话持续时间。
5. 总结
Nginx RTMP 日志模块提供了强大的日志功能,允许管理员详细记录 RTMP 流的各种事件(如客户端连接、流发布、播放、断开等)。日志数据可以自定义格式,并输出到指定的文件中,支持实时监控和后期分析。重点理解以下几个概念:
-
日志格式:通过
log_format
配置指令来定义日志输出的格式。可以包含多种变量,如远程地址、命令类型、流名称、传输字节等。 -
日志操作:每个日志操作(如获取远程地址、命令等)都由特定的函数来处理,日志格式中的变量会被动态计算并输出。
-
日志写入:日志写入是通过
ngx_rtmp_log_write
函数进行的,如果日志文件已满或者出现错误,会记录错误信息。
该模块非常适合用于实时监控 RTMP 服务器的状态,分析客户端行为,或用于生成流量报告。