本章我们主要介绍一下nginx中syslog的实现。
1. 相关静态函数声明
宏定义NGX_SYSLOG_MAX_STR
用于计算最长的syslog日志的长度,从上面可以看到,其中MSG的Content
部分的最长长度为NGX_MAX_ERROR_STR
,及2048;接下来是PRI
及HEADER
部分的长度。
2. 相关静态变量的定义
-
facilities: 用于定义syslog的facility(模块)
-
severities: 用于定义优先级
-
ngx_syslog_dummy_log: 由于nginx syslog也是作为nginx普通日志模块(ngx_log_t)的一部分,因此这里作为dummy存在。
-
ngx_syslog_dummy_event: 作为绑定syslog UDP发送数据的一个伪event
存在。
3. 函数ngx_syslog_process_conf()
此函数用于解析nginx配置文件中的syslog配置。下面我们给出几个syslog配置的示例,再来分析函数的实现:
error_log syslog:server=192.168.1.1 debug;
access_log syslog:server=unix:/var/log/nginx.sock,nohostname;
access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;
本函数较为简单,首先直接调用ngx_syslog_parse_args()来进行解析,然后对未设置的值(facility、severity、tag)设置默认值。
4. 函数ngx_syslog_parse_args()
下面我们简要分析一下函数的实现:
本函数用于构造syslog的header部分。可以注意到这里用了ngx_cached_syslog_time
,因为nginx中很多地方都需要用到时间戳信息,但是如果每一次都调用系统函数去获取的话,则会造成系统性能降低,因此这里会采用缓存的时间。(缓存时间按一定频率进行更新)
6. 函数ngx_syslog_writer()
本函数用于格式化buf
中的内容: 添加上header信息,加上末尾的换行信息,对过长的日志进行截断。然后将格式化好的日志内容发送到syslog接收服务器
7. 函数ngx_syslog_send()
本函数用于向syslog接收服务器发送日志。
8. 函数ngx_syslog_init_peer()
本函数用于建立非阻塞的UDP socket,稍后采用该socket来发送日志信息。注意这里为该socket绑定了ngx_syslog_dummy_event。
9. 函数ngx_syslog_cleanup()
本函数用于处理在syslog绑定的内存池销毁时,如果对应的发送socket未关闭,则这里进行关闭。
[参看]
-
Logging to syslog
-
syslog日志服务
-
syslog
-
syslog 详解