在上一遍博文中咱们介绍了Nginx容器访问日志收集的方案,咱们使用EFK的架构来完成对容器日志内应用日志的收集,若是不知道什么是EFK架构,那么请访问如下连接获取相关的帮助docker
Nginx容器日志收集方案fluentd+elasticsearch+kilbanaapache
若是你已经认真阅读了上面的连接,并撑握了其用法,那么再来看本博文(针对于初学者),下面假设咱们已经搭建好了上一讲所须要的基础环境,咱们接下来就直接开始步入正题。json
在步入正题以前咱们首先须要确认咱们须要完成的目标与效果,一样咱们在启动Tomcat容器的时候使用fluentd日志驱动,将标准输出的日志发送到fluentd服务端,而后经过fluentd服务端处理日志发送至ES,最后再经过kilbana展现日志。就这么简单?NO NO NO!!!经测试默认状况下Tomcat容器(docker hub官方镜像)内catalina的日志会自动从stdout输出,并发送到fluentd服务端,但access日志不会,这是咱们第一个须要解决的技术问题,另外Tomcat的日志默认状况下是天天滚动生成,天天日志名称都不同,这是咱们须要解决的第二个问题,假设咱们解决了以上两个问题,最后还会存在一个问题,也就是咱们输出的日志有两种类型,咱们又如何经过fluentd服务端区分不一样的日志,并发送到ES存储为不一样的Index。咱们明白了目标和技术难题下面咱们就一步一步来解决。tomcat
第一个问题解决方法(先解决第二个问题再解决第一个问题):bash
咱们能够手工指定将access日志输出到/dev/stdout,因此此方法刚下载下来的镜像没法直接使用,咱们须要从新build该镜像建立一个/dev/stdou的软连接到Tomcat的access日志文件路径。架构
ln -s /dev/stdout /usr/local/tomcat/logs/localhost_access_log.txt
第二个问题解决方法:并发
默认docker hub官方的tomcat镜像的日志是天天滚动生成的,因此咱们须要从新build该镜像,关闭日志的滚动生成elasticsearch
关闭catalina日志的滚动生成ide
编辑容器内配置文件:/usr/local/tomcat/conf/logging.properties测试
#下面这一行是已经存在的一行,用来定义文件的前缀 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. #下面两行是须要加入的内容,分别为定义文件的后缀和关闭日志轮替,最终日志名称为catalina.out 1catalina.org.apache.juli.AsyncFileHandler.suffix = out 1catalina.org.apache.juli.AsyncFileHandler.rotatable = False
关闭access日志的滚生成
编辑配置文件:/usr/local/tomcat/conf/server.xml
#配置中rotatable="false"是咱们加入的内容,而pattern里面的内容是咱们须要修改成的内容,用来将访问日志转换为json格式用来关闭日志的轮替,最终日志名称为localhost_access_log.txt <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="{"client":"%h", "client user":"%l", "authenticated":"%u", "access time":"%t", "method":"%r", "status":"%s", "send bytes":"%b", "Query?string":"%q", "partner":"%{Referer}i", "Agent version":"%{User-Agent}i"}" rotatable="false" />
第三个问题解决方法:
这里咱们能够采用经过fluentd服务端对收集过来的日志再进行过滤,分类从新打标签,最后再发送到ES存为不一样的Index,修改fluentd服务端配置文件以下:
#若是没有rewrite-tag-filter插件请安装gem install fluent-plugin-rewrite-tag-filter <source> @type forward port 24224 bind 0.0.0.0 </source> #下面根据tomcat.test.docker标签进行过滤,由于里面有两种日志输出,分别为access和catalina <match tomcat.test.docker> @type copy <store> @type rewrite_tag_filter #这里是匹配咱们的catalina日志,根据log字段用正则匹配,这里须要根据本身字段进行修改正则 rewriterule1 log ^\d.*$ catalina.${tag} </store> <store> @type rewrite_tag_filter #由于咱们的访问日志转换为了json,因此开头必定为{,这里根据正则匹配,匹配到后从新打tag rewriterule1 log ^{.*$ access.${tag} </store> </match> #对访问日志作json转换,**表明任何字符 <filter access.**> @type parser format json key_name log </filter> #将访问日志输出到ES,索引名为tomcat.test.docker.access <match access.**> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix tomcat.test.docker.access logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match> #将catalina日志输出到ES,索引名为tomcat.test.docker.catalina <match catalina.**> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix tomcat.test.docker.catalina logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match>
完成以上配置之后咱们只要启动咱们的fluentd服务端服务和Tomcat容器,并访问下咱们的Tomcat站点,这时候就能够在ES中查看到咱们所须要的Index了
systemctl start td-agent docker run -dit -p 80:8080 --log-driver=fluentd --log-opt fluentd-address=192.168.3.232:24224 --log-opt tag="tomcat.test.docker" tomcat
上面须要注意tag,须要和fluentd服务端配置文件里面接收的tag同样
最后还有一个技术问题,一直没有解决,须要你们独立思考,若是有好的解决方案能够在博文中留言,若是后续我解决了,会及时更新此博文。问题就是catalina的错误日志多行合并处理,目前没有找到适合的方法
.