公司需要搭建一个日志收集服务器,用于将公司的项目日志汇总到一台服务器上面,方便查看和减轻各项目服务器压力。但是由于目前资源不够充足,所以放弃使用ELK、EFK。最后在调研尝试过Linux自带的Syslog和fluentd之后,Linux自带的Syslog虽然更简单,但是汇总的数据中会有乱码的情况(怀疑是Appender问题),并且将日志信息组合成Json格式比较麻烦,因此选择使用fluentd来做日志收集。,选用fluentd来做日志收集选择使用源码来进行安装,并且需要安装一些依赖的插件,如Ruby等,下面依次介绍需要安装的组件。,下载ruby压缩包 ruby-2.6.5.tar.gz,版本:2.6.5,并解压,安装ruby,安装需要gcc,安装完成后修改系统配置文件 /etc/profile,在最后添加ruby目录并加到path中,验证是否安装成功,显示ruby版本号,安装成功,从github上拉取fluentd源码,github地址:fluentd,先查看当前默认源,移除默认源,添加源,目前可用的有ruby-china的源,添加ruby-china源,更新缓存,等待提示安装成功,进入fluentd文件夹后,构建项目,安装完成,最后在控制台显示fluentd读取的配置文件信息并且打印相关日志。至此日志收集服务器所需要的fluentd已经搭建完成,接下来就是配置fluentd以完成日记收集功能。,解决方案 安装zlib-devel,进入ruby源码文件夹,安装ruby自身提供的zlib包ruby-2.5.1/ext/zlib,在make时会报错,修改目录中Makefile文件,改成,到这里就可以make成功了。,错误描述:cannot load such file — openssl,解决方案,在ruby自身提供的额外文件夹中ruby-2.6.5/ext/openssl,执行ruby ./extconf.rb,再make,make时出错,修改Makefile文件,在文件顶部添加top_srcdir = ../..,在上一节中完成了在日志服务器上单间fluentd,该日志收集服务器有五个需求,通过修改fluentd等配置文件来完成相关的需求。,修改配置文件,在 模块中添加path属性,如果需要将匹配相同的tag输出到不同文件中则需要将 的@type设置为copy,然后再 块中添加 块并在 中添加path属性。,在path属性中可以读取过滤的tag,tag的格式为logback配置文件中的.,因此可以将应用名设定在logback配置文件中,然后再fluentd.conf中进行读取。在path中通过${tag}占位符读取客户端发送的tag,tag属性可以根据.切分为数组,例如tag为test.demo时,tag[0]表示test,tag[1]表示demo。对于时间的配置可直接在path路径中设置,并且在buffer块加上time及timekey配置,配置文件如下:,最后得到的目录如下,修改配置文件,在match块中添加buffer块配置,配置内容如下,将buffer刷新模式修改为interval按固定时间间隔刷新,并且设置刷新的周期以及不追加文件。这样当buffer有内容时,每过10s将日志文件保存一次,或者当buffer块达到5MB就立即存一次,保证每个日志文件的大小都保证在5MB以内。生成的日志目录结构如下:,为方便查看各类等级日志的情况,需要在目录中添加日志等级并将相应的日志放入。在不修改客户端tag情况下,在fluentd服务端重新生成tag以包含日志等级,此时需要 rewrite_tag_filter 插件来完成重置tag。在使用插件前需要安装该插件,然后在fluent.conf配置文件中配置,原来的输入日志格式如下,在日志信息中msg、level对应的值都包含日志等级,因此可以从键msg、level中选出日志等级来组成新的tag,这里选则提取msg对应的value中的日志等级。配置文件中的pattern属性所写正则表达式就是用来匹配msg中[]中的值的,然后再tag上将取出来的日志等级通过$1放到原来tag的最后面。,注意:如果match上的匹配规则和修改后的tag能够对应,则会一直进行匹配,从而导致修改tag失败,如下,此时修改后的tag仍然是以com.zhy开头,所以会导致修改失败,所以在新的tag前加上level前缀,level可自定义,在nginx配置文件中增加server配置,在server中添加root属性,设置映射到服务器根目录下的/data目录中,location属性分为两步第一步开启文件浏览,第二步设置在浏览器文本格式显示文件内容,通过autoindex来开启文件浏览功能,配置客户端浏览路径为/log,首先通过正则表达式匹配浏览路径,匹配规则以/log开头并且以.log结尾的文件,然后设置Content-Type为text/plain,在浏览器便可直接浏览日志内容,如果不设置将会弹出下载窗口进行下载,并且需要清理浏览器的缓存,需求是希望能够在项目文件夹下生成一个日志文件,与前面的日志文件不同的是该日志是显示当前日志内容,并且大小固定。由于fluentd的append生成的文件虽然能够追加到一个文件中,但是不能够固定大小,日志大小会无限膨胀。通过查阅资料,最后选择使用linux自带的日志转存工具 logrotate 来实现这需求。,由于目前linux都会自带logrotate,所以不需要安装,比较便捷。并且logrotate在github的更新还是比较活跃的。github地址:logrotate,1.修改配置,在使用logrotate之前,先修改fluentd配置,使其在每个项目中生成一个对应的即时日志文件。在 match 块中添加一个 store 块。,配置中主要是在对应项目文件夹下生成一个名为 appname_immediate.log 的日志文件,并且该日志文件用append追加内容,选择以5s为周期性刷新,由于是即时日志文件,所以刷新频率高。之所以不用immediate模式是因为考虑的服务器负载,如果立即刷新的话可能会造成负载较高,所以选用延迟几秒来追加日志内容,然后修改logrotate配置文件,器配置文件在 /etc/logrotate.conf 中,但是在该配置文件中不方便管理,因此可以自己写一个配置文件,保存到 /etc/logrotate.d 目录中,在该目录中已经保存有几个自带的logrotate配置。这里我们新建一个配置文件,命名 applog ,并在文件中添加配置项:,logrotate配置文件中第一行表示在配置转存文件的路径,这里转存的是在/data/log目录下的所有以_immediate.log结尾的文件,路径配置可以使用通配符。其余配置见注释,这里主要的作用时每天转存一次日志文件,当文件大小超过10MB时转存,并且进行压缩,转存文件最多存在3个。其余配置参考官网:logrotate配置详解,在完成配置后,可以通过命令查看配置文件是否正确,运行后会在控制台显示所读取配置文件、转存信息等。如果想看实际效果,将命令中的-d变为-f强制执行。运行-f命令后会在应用对应的immediate.log目录中生成一个以日期结尾的压缩文件,并且原来的日志文件被清空。这时logrotate配置完成。,2.logrotate执行时间,logrotate是通过cron定时任务执行的,查看cron配置文件可以看到定时任务的执行时间,CentOS使用的是anacron,配置文件在 /etc/anacrontab 中,配置文件中 START_HOURS_RANGE=3-22 表示定时任务开始时间,默认是在3点到22点之间, RANDOM_DELAY=45 表示启动任务后的最大随机延迟时间,默认最大延迟45分钟执行。最后三行是对于不同的定时任务配置,在cron.daily行就是定义每天的定时任务执行方式,每天一次,并且强制延迟5分钟执行,所以默认配置一般会在凌晨三点过执行。,在这里修改START_HOURS_RANGE、RANDOM_DELAY以及cron.daily的delay,可以自定义每日定时任务的执行时间。,在所有都配置好后,使用 logrotate -d 不报错,手动执行 logrotate -f 也能够生成转存文件,但是转存文件却不能按照配置每天自动生成。,查看cron日志(cron日志地址:/var/log/cron)发现每天的定时任务都会执行,但是没有生成转存文件。,出现该问题是由于selinux的安全策略导致的,只需要给转存日志所在的目录增加安全上下文 var_log_t 即可,执行上面命令会对/data/log目录中的所有文件添加安全上下文。之后再观察转存文件便能够成功生成。,以上就是Fluentd搭建日志收集服务的详细内容,更多关于Fluentd 日志收集的资料请关注其它相关文章!