ELK搭建和tomcat日志分析

2022-08-12 21:21:54 浏览数 (1)

学习目标 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日志

代码语言:javascript复制
[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文件中

代码语言:javascript复制
//e.printStackTrace();//打印在控制台 
public Result testWarnLog(){ 
log.warn("测试warn日志"); 
Result res = new Result(); 
try{ 
int a = 1/0; 
}catch (Exception e){ 
e.printStackTrace(); 
} 
return res; 
} 
//异常信息打印在localhost.log文件中 
public Result testExceptionLog(){ 
int a = 1/0; 
Result res = new Result(); 
return res; 
} 

liunx安装elasticsearch

代码语言:javascript复制
这里使用是是5.2.版本, 
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

代码语言:javascript复制
Logstash: 是一个灵活的数据传输和处理系统,在beats出来之前,还负责进行数据收集。Logstash的任务,就是将各种各样的数据,经过配置转化规则,统一化存入Elasticsearch。使用Ruby开发的Logstash在灵活性上,非常出色。不过性能一直是被诟病的问题。 
由于Logstash在数据收集上并不出色,而且作为agent,性能并不达标。elastic发布了beats系列轻量级采集组件。至此,elastic形成了一个完整的生态链和技术栈,成为大数据市场的佼佼者。 
使用管理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

代码语言:javascript复制
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插件

代码语言:javascript复制
参考下面两篇文章 
(先看这个比较详细)https://segmentfault.com/a/1190000018151612 
(补充看这个)https://blog.csdn.net/sinat_35930259/article/details/81052139 

logstash处理时区问题

代码语言:javascript复制
https://blog.csdn.net/wuyinggui10000/article/details/77879016 

logstash最后一行

代码语言:javascript复制
如下面配置 由于配置了匹配到一个日期就是一个事件, 
多行的话,就将以下的不是日期开头的归到前一个事件 
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(<generated>) 
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(<generated>) 
at org.springframework.cglib.pro 
处理方案 
auto_flush_interval : 为了解决最后一行丢失问题(因为没有下一行到来前,无法判断改行是否完成),这个参数表示超过这个时间如果没来新行,则自动把它当成当前行。(这个参数在2.2版本及之后才支持) 
https://my.oschina.net/xiangtao/blog/1504631 
绝对路径 
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

代码语言:javascript复制
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

代码语言:javascript复制
进入cd logstash/bin 
./logstash-plugin install logstash-input-jdbc 

0 人点赞