今天我们来聊一聊Tomcat,相信大家并不陌生,tomcat是一个免费开源的web应用服务器,属于轻量级的应用程序,在小型生产环境和并发不是很高的场景下被普遍使用,同时也是开发测试JSP程序的首选。也是处理jsp动态请求不错的选择,

我们都知道通过日志定位tomcat的问题,那么,我们有真正了解过tomcat的日志吗?如何做到对tomcat的日志实时监控,分析展示呢?

【tomcat日志剖析】

我们的tomcat主要有两种日志类型,即访问日志(localhost_access_log.Y-M-D.txt)以及运行状态日志(catalina.out)

localhost_access_log.Y-M-D.log:访问日志主要是记录访问的时间,IP以及访问的资料等相关信息

catalina.out其实记录了tomcat运行状态信息以及异常告警信息等

我们如何对上面的日志进行监控和分析展示呢?

首先我们可以通过logstash-output-zabbix插件监控catalina.out的日志输出信息,过滤出异常关键词,并推送到zabbix平台上,实时告警

第二,我们可以将访问日志localhost_access_log.Y-M-D.log进行收集推送到Kibana平台上进行展示,两者互不影响

【Tomcat日志整改】

我们要想更好的将tomcat两种日志准确的定位抓取,需要自定义tomcat日志格式

首先是locathost_accesslog.Y-M-D.log访问日志,将日志输出定义为json格式,方便后续kibana展示

  1. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  2. prefix="localhost_access_log." suffix=".txt"
  3. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  1. Note: The pattern used is equivalent to using pattern="common" -->
  2. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  3. prefix="localhost_access" suffix=".log"
  4. 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;}"/>

参数详情

directory:日志文件存放的位置

prefix:日志文件名称前缀

suffix:日志名称后缀

pattern:是一个json解析字段的参数

  1. &quot;client&quot;:&quot;%h&quot;其中%h表示请求的主机名称,这里指的是请求端的IP
  1. &quot;client user&quot;:&quot;%l&quot;其中%l记录的是刘拉着进行身份验证时提供的名称
  1. &quot;authenticated&quot;:&quot;%u&quot; 其中%u代表获得验证的访问请求者,否则就是"-"
  1. &quot;access time&quot;:&quot;%t&quot; 其中%t代表请求的时间
  1. &quot;method&quot;:&quot;%r&quot; 其中%r代表请求的方法和URL
  1. &quot;status&quot;:&quot;%s&quot; 其中%s代表HTTP的响应状态码
  1. &quot;send bytes&quot;:&quot;%b&quot; 其中%b代表发送请求的字节数,但不包括请求http头部信息
  1. &quot;Query?string&quot;:&quot;%q&quot; 其中%q指的是查询字符串的意思
     #tail -f  tomcat_access2018-09-18.log
  1. {"client":"192.168.2.10", "client user":"-", "authenticated":"-", "access time":"[18/Sep/2018:17:17:12 +0800]", "method":"GET /favicon.ico HTTP/1.1", "status":"", "send bytes":"", "Query?string":"", "partner":"http://192.168.2.101:8080/", "Agent version":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}

输出日志并JSON校验

 【catlina.out日志输出整改】

我们tomcat的运行状态日志的输出看上去很不顺眼,很不友好,为了能够更好的分析,我们需要进行整改

# vim /usr/local/tomcat/conf/logging.properties

  1. #java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter #将其删除或者注释掉
    添加下面两行配置,
  2. lina.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
  3. java.util.logging.SimpleFormatter.format = %$tY-%$tm-%$td %$tH:%$tM:%$tS.%$tL [%$s] [%$s] %$s %$s %$s%n

【filebeat配置】

  1. filebeat.inputs: #定义数据原型
  2. - type: log #指定数据输入的类型,还可以指定为stdin,即为标准输入
  3. enabled: true #启动手工配置filebeat,
  4. paths: #指定需要监控的日志文件
  5. - /usr/local/tomcat/logs/tomcat_access2018--.log #这是tomcat的访问日志文件
  6. fields:
  7. log_topic: tomcat_access_logs #自定义tomcat访问日志的topic主题,推送到kafka消息队列
  8.  
  9. - type: log
  10. enabled: true
  11. paths:
  12. - /usr/local/tomcat/logs/catalina.out #这是定义的第二个tomcat日志文件catalina.out,运行状态日志
  13. fields:
  14. log_topic: tomcat_catalina_logs #自定义tomcat的运行状态日志topic主题名称,用于推送到kafka消息队列
  15.  
  16. processors: #设置删除不必要的字段
  17. - drop_fields:
  18. fields: ["beat", "input", "source", "offset", "prospector"]
  19. filebeat.config.modules:
  20. path: ${path.config}/modules.d/*.yml
  21. reload.enabled: false
  22.  
  23. name: 192.168.2.101 #设置filebeat收集日志文件对应主机的名称
  24. output.kafka: #指定输入端,支持想kafka,logstash,elasticsearch输出数据
  25. enabled: true #启动该模块
  26. hosts: ["192.168.2.100:9092", "192.168.2.101:9092", "192.168.2.102:9092"]
  27. version: "0.10"
  28. topic: '%{[fields.log_topic]}' #这是指定topic,注意写法,上面新增了两个字段,两个对应的日志文件会分别写入不同的topic
  29. partition.round_robin:
  30. reachable_only: true
  31. worker: 2
  32. required_acks: 1
  33. compression: gzip
  34. max_message_bytes: 10000000
  35. logging.level: debug

下面是kafka消息队列中tomcat消息,都为json格式输出,可通过json校验工具校验一下格式:http://www.bejson.com/

 【Logstash配置】

[root@logstash etc]# /usr/local/logstash/bin/logstash-plugin install logstash-output-zabbix   #既然需要结合zabbix监控tomcat的catilna.out的异常日志,需要安装logstash-output-zabbix插件
Validating logstash-output-zabbix
Installing logstash-output-zabbix
Installation successful

  1. input { #这里定义了两个消费topic,分别读取的是tomcat的访问日志和catalina.out文件
  2. kafka {
  3. bootstrap_servers => "192.168.2.100:9092,192.168.2.101:9092,192.168.2.102:9092"
  4. topics => ["tomcat_access_logs"]
  5. codec => "json"
  6. }
  7. kafka {
  8. bootstrap_servers => "192.168.2.100:9092,192.168.2.101:9092,192.168.2.102:9092"
  9. topics => ["tomcat_catalina_logs"]
  10. codec => "json"
  11. }
  12. }
  13.  
  14. filter {
  15. if [fields][log_topic] == "tomcat_catalina_logs" { #判断语句,根据topic不同,对日志做不同的过滤、分析,先分析的是catalina.out文件
  16. mutate {
  17. add_field => [ "[zabbix_key]", "tomcat_catalina_logs" ] #这里是直接用topic主题
  18. add_field => [ "[zabbix_host]", "%{[host][name]}" ]
  19. }
  20. grok {
  21. match => { "message" => "%{TIMESTAMP_ISO8601:access_time}\s+\[(?<loglevel>[\s\S]*)\]\s+\[%{DATA:exception_info}\](?<tomcatcontent>[\s\S]*)" }
  22. }
  23. date {
  24. match => [ "access_time","MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
  25. }
  26. mutate {
  27. remove_field => "@version"
  28. remove_field => "message"
  29. #remove_field => "[fields][log_topic]"
  30. #remove_field => "fields"
  31. remove_field => "access_time"
  32. }
  33.  
  34. }
  35. if [fields][log_topic] == "tomcat_access_logs" { #判断语句,根据topic不同,对日志做不同的过滤、分析,这里分析的是访问日志文件
  36. json {
  37. source => "message" #由于访问日志文件已经是json格式,所以这里解码出来即可
  38. }
  39. date {
  40. match => [ "access time" , "[dd/MMM/yyyy:HH:mm:ss Z]" ] #时间字段转换,然后赋值给@timestamp字段
  41. }
  42. mutate {
  43. remove_field => "@version" #删除不需要的字段
  44. remove_field => "message" #删除message字段
  45. }
  46. }
  47. }
  48.  
  49. output {
  50. if [fields][log_topic] == "tomcat_catalina_logs" { #输出判断,根据不同的topic,做不同的输出设置
  51. if ([loglevel] =~ "INFO" or [tomcatcontent] =~ /(Exception|error|ERROR|Failed)/ ) { #对catalina.out文件出现前面指定的关键字,过滤关键字,推送到zabbix端实现出发告警
  52. zabbix {
  53. zabbix_host => "[zabbix_host]"
  54. zabbix_key => "[zabbix_key]"
  55. zabbix_server_host => "192.168.2.102" #这里指定的zabbix-serverIP地址
  56. zabbix_server_port => ""
  57. zabbix_value => "tomcatcontent" #这是输出到zabbix的内容配置
  58. }
  59. }
  60. }
  61. if [fields][log_topic] == "tomcat_access_logs" { #输出判断,根据不同的topic,做不同的输出设置,这是将访问日志输出到elasticsearch集群
  62. elasticsearch {
  63. hosts => ["192.168.2.100:9200","192.168.2.101:9200","192.168.2.102:9200"]
  64. index => "tomcatlogs-%{+YYYY.MM.dd}"
  65. }
  66. }
  67. # stdout { codec => rubydebug } #调试模式,可以方便观看日志输出是否正常,调试完成后,删除即可
  68. }

# nohup /usr/local/logstash/bin/logstash -f tomcat_logs.conf &  #后台执行运行logstash事件

ps:下图是前台执行的测试,需要在output加上stdout { codec=rubydebug}参数,可以用作调试

【zabbix创建监控模板】

【验证zabbix监控端】

验证一下,故意在tomcat配置文件输出错误配置,然后运行tomcat,此时,catilna.out日志便会有输出,而输出中已经在logstash事件配置中做了相应的过滤和指定,会将错误信息直接推送到zabbix,实现出发告警

效果如下:

【验证tomcat的访问日志】

我们知道,当tomcat有一定的访问量之后,会先存入ES中,由kibana拉取展示分析,过程如下:

http://192.168.2.101:5601 访问kibana,创建tomcat日志索引

ELK对Tomcat日志双管齐下-告警触发/Kibana日志展示的更多相关文章

  1. ELK 收集 Tomcat日志以及修改Tomcat日志格式

    ELK 收集 Tomcat日志以及修改Tomcat日志格式 Tomcat日志 想要收集tomcat 日志 首先我们要对tomcat的日志有足够的了解 tomca日志分类 简单的说tomcat logs ...

  2. ELK收集tomcat访问日志并存取mysql数据库案例

    这个案例中,tomcat产生的日志由filebeat收集,然后存取到redis中,再由logstash进行过滤清洗等操作,最后由elasticsearch存储索引并由kibana进行展示. 1.配置t ...

  3. 24 Zabbix系统配置日志监控告警--关键字触发

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 24 Zabbix系统配置日志监控告警--关键字触发 trapper是被监控主机主动发送数据给za ...

  4. 4:ELK分析tomcat日志

    五.ELK分析tomcat日志 1.配置FIlebeat搜集tomcat日志 2.配置Logstash从filebeat输入tomcat日志 3.查看索引 4.创建索引

  5. elk收集tomcat日志

    1.elk收集tomcat普通日志: 只在logstash节点增加如下文件,重启logstash即可: cat >>/home/logstash-6.3.0/config/tomcat_t ...

  6. 利用 ELK系统分析Nginx日志并对数据进行可视化展示

    一.写在前面 结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法.而这篇文章介绍的是单独监控nginx 日志分析 ...

  7. ELK系统分析Nginx日志并对数据进行可视化展示

    结合之前写的一篇文章:ELK日志分析平台搭建全过程,上篇文章主要讲了部署方法.而这篇文章介绍的是单独监控nginx 日志分析再进行可视化图形展示. 本文环境与上一篇环境一样,前提 elasticsea ...

  8. elk系列7之通过grok分析apache日志【转】

    preface 说道分析日志,我们知道的采集方式有2种: 通过grok在logstash的filter里面过滤匹配. logstash --> redis --> python(py脚本过 ...

  9. 第1节 storm日志告警:1、 - 5、日志监控告警业务需求、代码、集群运行、总结

    如何解决短信或者邮件频繁发送的问题:每次发送的时候都先查询数据库记录,看一下有没有给这个人发送消息,上一次发送消息的时间是什么时候,如果发送时间间隔小于半个小时,就不要再发了 ============ ...

随机推荐

  1. java垃圾回收GC

    垃圾回收时,暂停虚拟机运行 基础假设:大部分对象只存在很短的时间 对于新生代,Minor GC经常会发生 Major/Full GC会对老生代做GC 老生代GC采用Compact算法,移动形成完整的空 ...

  2. https://oi-wiki.org/

    OI网站 https://oi-wiki.org/

  3. consul命令记录

    服务端启动脚本 #/bin/bash! echo "********************************************************************* ...

  4. P1742 最小圆覆盖(计算几何)

    体验过\(O(n^3)\)过\(10^5\)吗?快来体验一波当\(wys\)的快感吧\(QAQ\) 前置芝士1:二元一次方程组求解 设 \[\begin{cases}a1 * x + b1*y=c1\ ...

  5. Git服务器Gogs简易安装-Windows环境

    1.下载git for windows https://github.com/git-for-windows/git/releases/download/v2.15.0.windows.1/Git-2 ...

  6. (BFS) leetcode 279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...

  7. Hbase G1 gc 调优最终参数

    export HBASE_HEAPSIZE=16384export HBASE_OFFHEAPSIZE=25gexport HBASE_MASTER_OPTS="$HBASE_MASTER_ ...

  8. ES6 数组遍历方法的实战用法总结(forEach,every,some,map,filter,reduce,reduceRight,indexOf,lastIndexOf)

    目录 forEach every some map filter reduce && reduceRight indexOf lastIndexOf 前言 ES6原生语法中提供了非常多 ...

  9. [再寄小读者之数学篇](2014-06-23 Hardy 空间、BMO空间与 Triebel-Lizorkin 空间)

    $$\bex 0<p<\infty\ra H_p=\dot F^0_{p,2};\quad BMO=\dot F^0_{\infty,2}. \eex$$ see [H. Triebel, ...

  10. [物理学与PDEs]第2章习题7 一维不可压理想流体的求解

    设有以 $x$ 轴为轴向的等轴截面管道, 其中充满着沿 $x$ 方向流动的不可压缩的理想流体, 在每一横截面上流体的状态相同, 且 $p=p(x)$. 若已知 $p(0) =p_1$, $p(L)=p ...