日志数据记录了系统软件执行过程中的运行状态及所有系统行为,通过日志分析,可以感知过去发生了什么,继而帮助开发进行产品功能完善、问题定位及产品优化,同时可以进行审计追踪,提高系统的安全性,linux日志数据格式遵循syslog协议,早期的linux发行版内置syslog作为日志记录程序,当前业界普遍基于rsyslog替代syslog的功能,部分发行版已默认使用rsyslog作为日志收集工具。
rsyslog(rocket-fast system for log)是一个GPLv3的开源项目,源码托管在GitHub,它提供了高性能,高安全功能和模块化设计,上图为rsyslog官方网站的一张介绍图片,由图可以看出,rsyslog可以支持多种输入输出,能够满足多种场景的需求,rsyslog即能够满足企业级需求,同时也可以扩展到小型系统,还可以支持多种数据转储及日志过滤方式。
上图为rsyslog的架构图,介绍了rsyslog的整体架构,标明了rsyslog的消息流,参考图中架构,rsyslog整体分为输入模块、预处理模块、主队列模块、过滤模块、执行队列模块和输出模块。各个模块如下:
- Input模块:该模块是日志消息输入,rsyslog支持多种输入模式,每种输入对应不同的模块实现,比如imtcp模块、imudp模块、imklog模块等。
- 预处理模块:该模块主要用于解决各种syslog协议实现间的差异,举例说明如果日志系统client端使用rsyslog、server端使用syslog-ng,如果自己不做特殊处理syslog-ng是无法识别的。但是反过来,rsyslog的server端就可以识别syslog-ng发过来的消息。
- 主队列模块:该模块负责消息的存储,从Input传入的未经过滤的消息放在主队列中,过滤后的消息放入到不同action queue中,再由action queue送到各个输出模块。
- 过滤模块:该模块处理消息的分析和过滤,rsyslog可以根据消息的任何部分进行过滤。
- 执行队列模块:
- 输出模块:该模块依据配置文件对消息做处理,转换成对应的数据格式,对于不同的输出通道,提供不同的输出模块,比如omfile、omprog、omtcp、ommysql等。
rsyslog代码实现上,大量使用了宏定义,这种编码方式既可以提升代码的复用程度,切合module的模版化实现场景,但同时也导致代码冗杂不易理解,这里不对具体的代码流程做记录,rsyslog针对具体的业务场景,可以很方便的增加相应的模块实现,比如输入或输出模块,具体实现可参考以下项目:https://github.com/ecronic/omrabbitmq
rsyslogd是rsyslog的守护进程,用于日志信息的处理,如图是linux的日志处理机制,glibc库提供了一套syslog函数,作为linux日志收集接口,如下:
#include <syslog.h>
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();
接口使用示例如下:
#include <syslog.h>
int main(int argc, char **argv)
{
openlog("Main", LOG_CONS | LOG_PID, 0);
syslog(LOG_DEBUG, "hello world '%s'/n", argv[0]);
closelog();
return 0;
}
rsyslog的配置官方文档有详细说明可以参考,这里不再过多记录。 另外大多数Linux发行版使用 logrotate 或 newsyslog 对日志进行管理,logrotate 程序是一个日志文件管理工具,可以根据需要对日志进行转储,logrotate 是基于 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate,同时我们可以在 /etc/logrotate
中找到其配置文件,具体配置参考相关实现。
分布式系统级应用依靠rsyslog并不能完全满足系统的日志管理需求,需要结合其他软件协同工作,常用的日志管理系统是ELK,ELK是一个业界广泛应用的日志管理系统,可以满足日志的收集、处理、过滤与可视化检索等场景需求,其部署架构示例如下:
- Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash是一款强大的开源数据处理工具,可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理,对日志进行收集、过滤,并将其存储供以后使用。
- Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。