最近想将服务的运行日志收集起来,首先了解到flume技术栈
采用flume方案定了之后有两种方式实现
1: 在应用中,log4j2直接发送日志信息到flume ,
2: 通过监控log4j2 产生的日志文件,将日志文件新产生的日志发送到flume
下面两种方式都会介绍,首先透漏下我们选择的解决方案,我们选择了第二种监控新产生的日志文件
为什么这么选择:
第一种方式需要修改服务中log4j2的配置,添加flume Appender , 在应用中,当日志输出时,就会输出到flume,很显然,这种方式耦合了应用,并且对应用的性能有影响,到底有多大影响,这个还没有测试,其次,这种方式应用中依赖了flume的依赖,假如将来部署服务的时候不想收集日志了,会不会对项目的启动有影响,这一点也还没有验证,后续可能会验证
第二种方式完全是监控日志文件,当产生新的日志文件或者日志文件中生成新的日志时,就会触发日志收集。完全脱离应用存在。
我们介绍第二种方式的探索过程:
需求:当日志目录下产生新的文件或动态产生日志时,收集日志,发送到flume
接下来了解flume能不能解决我们的需求:
flume 入门相关概念:
source:
channel:
sink ;
source 中有很多分类,我们着重分析了几个的使用场景和特点
execSource :
spooldirSource :
taildirSource:
syslogSource ;
httpSource ;
经过分析每种Source的特点,很容易发现tailSource最接近我们的需求:
但是也有几个问题:
1:log4j2产生日志的逻辑是当日志文件内容达到设置的size上限就会重命名该日志文件(例如:sysware-2018-12-20-1.log),然后新建一个sysware.log文件,供日志输出,重命名日志之后,和原来的sysware.log日志文件全路径不一致,taildirSource会当做一个新的日志文件,再次重复读取,造成重复读取的问题
2:dirSource监控的dir 可以指定文件名称或者通过正则,但是如果已经有子文件夹的日志读取不到
上面的问题只能通过源码方式解决了
XXXXXX
所有的准备工作都做好了,我们现在开始做一个demo
XXXX