- 介绍
因项目需要,最近采用inotify和IO多路复用技术,实现了一个轻量级的实时行文本文件内容提取的程序,主要目的是用来监控网关nginx的Access Log,并且对Access Log在本地进行实时解析,字段提取和上报的功能。该程序占用内存较小,在10k左右,最多占用1个核的资源,提供采样上报,全量/增量分析文本以及特定字段内容过滤等功能。该程序可以通过自定义connector插件将本地提取以及过滤的信息上报到远程服务器,以实现服务端的流量监控和实时统计;在代码里面已经实现了两个connector,一个是标准输出connector,一个是udp connector;
- 代码
https://github.com/gilbertwang1981/access_agent.git
- 配置介绍
# 监听目录配置,可以监听多个目录,数组格式
[dir_file,array]
# 被监控的目录
dir[0]=/root/test0
# 被监控的文件
file[0]=/root/test0/access_log.txt
# 被监控的目录
dir[1]=/root/test1
# 被监控的文件
file[1]=/root/test1/access_log.txt
# 日志字段提取配置,字段名=字段位置(从0开始):字段的大小(字节)
[field]
client_ip=12:16
host=13:32
method=16:8
resp_time=21:8
time=23:32
url=28:64
# 系统配置
[system]
# 文本分隔符
separator=0x09
# 是否以守护进程的方式启动
is_daemon=false
# 是否从文件开始读
is_from_begin=false
# 采样率,比如5代表5%
sampling_rate=5
# 字段内容过滤器,精确匹配,匹配到的才会上报采集
[filter]
# 格式:字段名=字段值,不配置,代表不用过滤字段内容
url=/customLayout/home/top
# 定义connector的路径,最大connector可支持的数量为32
[connectors,array]
connector_so_path[0]=/root/access_agent/src/connector/stdout_connector/stdout_connector.so
connector_so_path[1]=/root/access_agent/src/connector/udp_connector/udp_connector.so
- 实现自定义connector
extern int connnect_to_source(char * snd_buffer , int buffer_size , char * logbuffer);
int connnect_to_source(char * snd_buffer , int buffer_size , char * logbuffer) {
printf("STDOUT connector,消息内容:%s\n" , logbuffer);
return 0;
}
编译成动态连接库so文件,在配置文件中新增connector配置,可以配置多个connector,最多支持32个;传给connector的二进制数据,是按照配置文件中[field]配置项,组成的定长数据段;
# 定义connector的路径,最大connector可支持的数量为32
[connectors,array]
connector_so_path[0]=/root/access_agent/src/connector/stdout_connector/stdout_connector.so
connector_so_path[1]=/root/access_agent/src/connector/udp_connector/udp_connector.so