希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 ELK搭建和tomcat日志分析 丁D 学无止境 2019-09-06 10:06 63750已阅读 elk supervisor tomcat日志 logstash插件 摘要本文只要是为了搭建elk日志平台,所以先了解一下tomcat日志,为了知道要收集哪些日志文件,学习logstash插件。 >**学习目标** tomcat日志日志分析 ELK搭建 logstash插件 ##tomcat日志 tomcat里的几类日志: catalina(catalina.out,catalina.log) localhost manager admin host-manager 项目中常用的三种日志**catalina.out catalina.log localhost.log** >**catalina.out** catalina.out 是tomcat的标准输出(stdout)和标准出错(stderr),我们在应用程序中使用System.out/err打印的东西都会到这里来。另外,我们所有输出到控制台的日志也会记录进来。比如我们常用的log4j,也会记录到Catalina.out中。所以一般情况下Catalina.out会显得特别臃肿,查找信息时也不太方便。比如测试的时候我一般用DEBUG级别,发生产用ERROR级别。当然你也可以关掉它.默认是不会按天分割的。要自己设置。 >**catalina.log** catalina.{yyyy-MM-dd}.log是tomcat自己运行的一些日志,这些日志还会输出到catalina.out,但是**应用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log**,它是tomcat的启动和暂停时的运行日志,注意,它和catalina.out是里面的内容是不一样的,**catalina.log有的catalina.out都有,但是catalina.out有的catalina.log不一定有**。 >**localhost.log** 我们使用Spring,Spring的初始化我们往往是使用Spring提供的一个listener进行的,而如果Spring初始化时因为某个bean初始化失败,导致整个应用没有启动,这个时候的**异常日志是输出到localhost中的,而不是cataina.out中**。所以有的时候我们应用无法启动了,然后找catalina.out日志,但最后也没有定位根本原因是什么,就是因为我们找的日志不对. >**supervisor接管tomcat日志** supervisor接管tomcat的标准输出(stdout)和标准出错(stderr) 当我们使用supervisor可以配置**接管tomcat的cataina.out的日志**,所以cataina.out不会打印日志了,cataina.log 还是会打印日志,**supervisor并没有接管localhost.log日志**。 ```js [program:tomcat] command=/usr/local/tomcat/bin/catalina.sh run stdout_logfile=/usr/local/tomcat/logs/catalina.out stderr_logfile=/usr/local/tomcat/logs/catalina.out 因为使用catalina.sh run的方式启动是一种前台的启动方式,因此日志并不会输出到对应的tomcat日志里,当中有两句定义日志的指令,其中生效的是stderr_logfile,也就是说,是这条指令,使得尽管我们在前台启动的tomcat应用,依然会将日志输出到catalina.out里边。 ``` 没配log4j的时候 log.info/error/warn都不输出 异常信息输出到localhost文件中 ```js //e.printStackTrace();//打印在控制台 public Result testWarnLog(){ log.warn("测试warn日志"); Result res = new Result(); try{ int a = 1/0; }catch (Exception e){ e.printStackTrace(); } return res; } ``` ```js //异常信息打印在localhost.log文件中 public Result testExceptionLog(){ int a = 1/0; Result res = new Result(); return res; } ``` ##liunx安装elasticsearch ```js 这里使用是是5.2.0版本, https://www.elastic.co/cn/downloads/past-releases#elasticsearch 下载,解压,直接执行 cd /usr/local/elasticsearch-5.2.0/bin ./elasticsearch ./elasticsearch -d 会出现各种问题: (1)内存不足 https://blog.csdn.net/weixin_42475367/article/details/90743040 (2)不能用root用户启动,,注意我测试的时候是直接在root文件搞,发现不能用root用户启动,切换用户后,发现用户不能再root执行,没有权限,所以后面放在usr/local中。 chown -R es:es xxxdir 将xxxDir这个目录给es组:es用户 -R是指目录 (3)max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] https://www.jianshu.com/p/2285f1f8ec21 ``` ##Logstash ```js Logstash: 是一个灵活的数据传输和处理系统,在beats出来之前,还负责进行数据收集。Logstash的任务,就是将各种各样的数据,经过配置转化规则,统一化存入Elasticsearch。使用Ruby开发的Logstash在灵活性上,非常出色。不过性能一直是被诟病的问题。 由于Logstash在数据收集上并不出色,而且作为agent,性能并不达标。elastic发布了beats系列轻量级采集组件。至此,elastic形成了一个完整的生态链和技术栈,成为大数据市场的佼佼者。 ``` ```js 使用管理supervisord logstash https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/get_start/daemon.html 高可用借鉴一下(没实现) https://www.cnblogs.com/cheyunhua/p/11119252.html ``` **liunx安装logstash** ```js https://www.elastic.co/cn/downloads/past-releases#logstash (1)下载,解压 这里使用的是5.2.0跟es对应 注意可能内存不足,修改config/ jvm.option (2)在config中建立一个blog_log.conf [root@iZwz9278r1bks3b80puk6fZ config]# cat blog_log.conf input { file { path => "/root/blog/blog_error.log" type => "blog-error-log" start_position => "beginning" codec => multiline { pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" negate => true auto_flush_interval => 3 what => previous } } file { path => "/root/blog/blog_info.log" type => "blog-info-log" start_position => "beginning" codec => multiline { pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" negate => true auto_flush_interval => 3 what => previous } } } output { elasticsearch { hosts => ["39.108.231.144:9200"] index => "blog-%{+YYYY.MM.dd}" } } (3)检查配置文件对不对,可以省略 ../bin/logstash -f blog_log.conf --config.test_and_exit (4)启动 cd bin ./logstash -f ../config/blog_conf nohup ./logstash -f ../config/blog_conf & ``` **logstash插件** ```js 参考下面两篇文章 (先看这个比较详细)https://segmentfault.com/a/1190000018151612 (补充看这个)https://blog.csdn.net/sinat_35930259/article/details/81052139 ``` **logstash处理时区问题** ```js https://blog.csdn.net/wuyinggui10000/article/details/77879016 ``` **logstash最后一行** ```js 如下面配置 由于配置了匹配到一个日期就是一个事件, 多行的话,就将以下的不是日期开头的归到前一个事件 input { file { path => "/root/blog/blog_error.log" type => "blog-error-log" start_position => "beginning" codec => multiline { pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" negate => true what => previous } } file { path => "/root/blog/blog_info.log" type => "blog-info-log" start_position => "beginning" codec => multiline { pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" negate => true what => previous } } } output { elasticsearch { hosts => ["39.108.231.144:9200"] index => "blog-%{+YYYY.MM.dd}" } } 但是会出现一个问题 就是最后一行的问题 2019-09-09 15:50:56下面只会产生一个事件 就是 2019-09-09 15:34:56, 2019-09-09 15:50:56不会产生是因为不知道到什么时候结束。要等下一个日志过来才会产生, 日志如下 2019-09-09 15:34:56 [ERROR]-[Thread:http-nio-80-exec-10]-[com.ding.core.AopLoggerAspect.afterThrowing():56] / by zero java.lang.ArithmeticException: / by zero at com.ding.controller.admin.ArticleController.testExceptionLog(ArticleController.java:218) at com.ding.controller.admin.ArticleController$$FastClassBySpringCGLIB$$6f196764.invoke() at org.springframework.cglib.pro 2019-09-09 15:50:56 [ERROR]-[Thread:http-nio-80-exec-10]-[com.ding.core.AopLoggerAspect.afterThrowing():56] / by zero java.lang.ArithmeticException: / by zero at com.ding.controller.admin.ArticleController.testExceptionLog(ArticleController.java:218) at com.ding.controller.admin.ArticleController$$FastClassBySpringCGLIB$$6f196764.invoke() at org.springframework.cglib.pro ``` ```js 处理方案 auto_flush_interval : 为了解决最后一行丢失问题(因为没有下一行到来前,无法判断改行是否完成),这个参数表示超过这个时间如果没来新行,则自动把它当成当前行。(这个参数在2.2版本及之后才支持) https://my.oschina.net/xiangtao/blog/1504631 ``` ```js 绝对路径 sincedb_path => "/dev/null" 我们增加了一个参数sincedb_path,其值为“/dev/null”,这个参数的是用来配置记录logstash读取日志文件位置的文件的名称的,我们将文件的名称指定为“/dev/null”这个 Linux 系统上特殊的空洞文件,那么 logstash 每次重启进程的时候,尝试读取 sincedb 内容,都只会读到空白内容,也就会理解成之前没有过运行记录,自然就从初始位置开始读取了! /usr/local/logstash-5.2.0/data/plugins/inputs/file ``` ##kibana ```js https://www.elastic.co/cn/downloads/past-releases#kibana (1)下载解压,这里使用5.2.0版本 (2)cd bin ./kibana nohup ./kibana & 学习一下 kibana 日志查询语法(百度) 比如根据某个字段查询关键字 可以安装插件 LogTrail, kibanna 使用 ps-ef|grep kibanna是查询不到进程号的 主要原因大概是因为 kibana 是node 写的。所以kibana 运行的时候是运行在node 里面。 ps-ef|grep node netstat -tunlp|grep 5602 tcp 0 0 0.0.0.0:5602 0.0.0.0:* LISTEN 16221/./../node/bin kill 16221 ``` ###安装logstash-input-jdbc ```js 进入cd logstash/bin ./logstash-plugin install logstash-input-jdbc ``` 很赞哦! (19) 上一篇:Elasticsearch之索引管理、自定义分析器、地理坐标点 下一篇:Elasticsearch之IKAnalyzer 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡