Tomcat容器日志收集方案fluentd+elasticsearch+kilbana

在上一遍博文中我们介绍了Nginx容器访问日志收集的方案,我们使用EFK的架构来完成对容器日志内应用日志的收集,如果不知道什么是EFK架构,那么请访问以下链接获取相关的帮助

Nginx容器日志收集方案fluentd+elasticsearch+kilbana

如果你已经认真阅读了上面的链接,并撑握了其用法,那么再来看本博文(针对于初学者),下面假设我们已经搭建好了上一讲所需要的基础环境,我们接下来就直接开始步入正题。

在步入正题之前我们首先需要确认我们需要完成的目标与效果,同样我们在启动Tomcat容器的时候使用fluentd日志驱动,将标准输出的日志发送到fluentd服务端,然后通过fluentd服务端处理日志发送至ES,最后再通过kilbana展示日志。就这么简单?NO NO NO!!!经测试默认情况下Tomcat容器(docker hub官方镜像)内catalina的日志会自动从stdout输出,并发送到fluentd服务端,但access日志不会,这是我们第一个需要解决的技术问题,另外Tomcat的日志默认情况下是每天滚动生成,每天日志名称都不一样,这是我们需要解决的第二个问题,假设我们解决了以上两个问题,最后还会存在一个问题,也就是我们输出的日志有两种类型,我们又如何通过fluentd服务端区分不同的日志,并发送到ES存储为不同的Index。我们明白了目标和技术难题下面我们就一步一步来解决。

第一个问题解决方法(先解决第二个问题再解决第一个问题)

我们可以手工指定将access日志输出到/dev/stdout,所以此方法刚下载下来的镜像无法直接使用,我们需要重新build该镜像创建一个/dev/stdou的软链接到Tomcat的access日志文件路径。

ln -s /dev/stdout  /usr/local/tomcat/logs/localhost_access_log.txt

第二个问题解决方法:

默认docker hub官方的tomcat镜像的日志是每天滚动生成的,所以我们需要重新build该镜像,关闭日志的滚动生成

关闭catalina日志的滚动生成

编辑容器内配置文件:/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="{&quot;client&quot;:&quot;%h&quot;,
                         &quot;client user&quot;:&quot;%l&quot;,
                         &quot;authenticated&quot;:&quot;%u&quot;,
                         &quot;access time&quot;:&quot;%t&quot;,
                         &quot;method&quot;:&quot;%r&quot;,
                         &quot;status&quot;:&quot;%s&quot;,
                         &quot;send bytes&quot;:&quot;%b&quot;,
                         &quot;Query?string&quot;:&quot;%q&quot;,
                         &quot;partner&quot;:&quot;%{Referer}i&quot;,
                         &quot;Agent version&quot;:&quot;%{User-Agent}i&quot;}"
               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的错误日志多行合并处理,目前没有找到适合的方法

.

时间: 2024-10-12 20:21:30

Tomcat容器日志收集方案fluentd+elasticsearch+kilbana的相关文章

Nginx容器日志收集方案fluentd+elasticsearch+kilbana

容器技术在发展到今天已经是相当的成熟,但容器不同于虚拟机,我们在使用容器的同时也有很多相关的技术问题需要解决,比如:容器性能监控,数据持久化,日志监控与分析等.我们不能像平时使用虚拟机一样来管理容器,本文我将给大家带来fluentd+elasticsearch+kilbana容器日志收集方案. 我们将通过容器的fluentd日志驱动将系统内产生的日志发送给fluentd服务端,再过来fluentd服务端处理所有容器发送过来的日志,再转发到elasticsearch,最后通过kilbana来展示和

容器内应用日志收集方案

容器化应用日志收集挑战 应用日志的收集.分析和监控是日常运维工作重要的部分,妥善地处理应用日志收集往往是应用容器化重要的一个课题. Docker处理日志的方法是通过docker engine捕捉每一个容器进程的STDOUT和STDERR,通过为contrainer制定不同log driver 来实现容器日志的收集,缺省json-file log driver是将容器的STDOUT/STDERR 输出保存在磁盘上,然后用户就能使用docker logs <container>来进行查询. 在部署

logstash日志收集分析系统elasticsearch&kibana

logstash日志收集分析系统Logstash provides a powerful pipeline for storing, querying, and analyzing your logs. When using Elasticsearch as a backend data store and Kibana as a frontend reporting tool, Logstash acts as the workhorse. It includes an arsenal of

ELK之三-----JAVA日志多行合并、tomcat json日志收集与处理

实战一:通过Logstash收集tomcat服务器的日志 1.配置JDK环境 1.解压JDK包,创建软链接 [[email protected] src]# tar xvf jdk-8u212-linux-x64.tar.gz [[email protected] src]# ln -sv /usr/local/src/jdk1.8.0_212/ /usr/local/jdk ‘/usr/local/jdk/jdk1.8.0_212’ -> ‘/usr/local/src/jdk1.8.0_21

利用开源日志收集软件fluentd收集日志到HDFS文件系统中

说明:本来研究开源日志的系统是flume,后来发现配置比较麻烦,网上搜索到fluentd也是开源的日志收集系统,配置简单多了,性能不错,所以就改研究这个东东了!官方主页,大家可以看看:fluentd.org,支持300+的plugins,应该是不错的! fluentd是通过hadoop中的webHDFS与HDFS进行通信的,所以在配置fluentd时,一定要保证webHDFS能正常通信,和通过webHDFS写数据到hdfs中! 原理图如下: webHDFS的相关配置与测试,请看这篇文章:http

开源日志收集软件fluentd 转发(forward)架构配置

需求: 通过开源软件fluentd收集各个设备的apache访问日志到fluentd的转发服务器中,然后通过webHDFS接口,写入到hdfs文件系统中. 软件版本说明: hadoop版本:1.1.2 fluentd版本:1.1.21 测试环境说明: node29服务器上安装了apache,以及fluentd,作为fluentd的客户端: node1服务器,为hadoop服务器的namenode: node29服务器上fluentd配置文件: <source>   type tail   fo

Graylog2实现Docker容器日志收集

Graylog2 是一个开源的日志存储系统,是由java语言编写的server,能够接收TCP,UDP,AMQP的协议发送的日志信息,并且基于mongodb数据库服务器快速存储,能够通过一个基于ruby编写的web管理界面,让轻松管理你的日志. 1.组件准备 名称 组件名称 备注 1 mongodb 2 elasticsearch 3 graylog2 2.安装使用Docker-compose部署docker-compose安装,参考:http://hujianxiong.com/linuxan

万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)

前面的 ELK 中我们是用 Filebeat 收集 Docker 容器的日志,利用的是 Docker 默认的 logging driver json-file,本节我们将使用 fluentd 来收集容器的日志. Fluentd 是一个开源的数据收集器,它目前有超过 500 种的 plugin,可以连接各种数据源和数据输出组件.在接下来的实践中,Fluentd 会负责收集容器日志,然后发送给 Elasticsearch.日志处理流程如下: 这里我们用 Filebeat 将 Fluentd 收集到的

Rancher体系下容器日志采集

引言 一个完整的容器平台,容器日志都是很重要的一环.尤其在微服务架构大行其道状况下,程序的访问监控健康状态很多都依赖日志信息的收集,由于Docker的存在,让容器平台中的日志收集和传统方式很多不一样,日志的输出和采集点收集和以前大有不同.本文就探讨一下,Rancher平台内如何做容器日志收集. 当前现状 纵览当前容器日志收集的场景,无非就是两种方式:一是直接采集Docker标准输出,容器内的服务将日志信息写到标准输出,这样通过Docker的log driver可以发送到相应的收集程序中:二是延续