1.通过Logstash收集java日志并输出到ES中

因为我们现在需要用Logstash收集tomcat日志,所以我们暂时将tomcat安装到Logstash所在机器,也就是db03:10.0.0.53这台机器,收集tomcat访问日志以及tomcat错误日志进行实时统计,在企业中,tomcat机器肯定不是单台,而是一个集群的形式,那么我们每台tomcat上都需要安装一个Logstash,然后将收集到的日志输出给Elasticsearch进行分析。


将tomcat日志改成json格式

在企业中,我们看到tomcat日志遇到异常(exception)一条日志可能是几行或者十几行甚至几十行,组成的,那么,我们需要将多行日志变成一行日志,来收集。

这里我们有几种方式可以实现:
1.将日志改成Json格式
在企业中,想要将java日志改成json格式,并没有那么容易。
格式不是你想改,想改就能改,让我挣开,让我明白,放手你的爱~~~~
因为将日志改成Json格式,查看起来会很难受,有些开发人员不希望将日志格式改成Json的,所以,在改日志格式之前需要跟开发人员进行沟通,那么将tomcat日志格式改成Json格式也有两种方式。
1)开发自己更改,通过程序代码,或者log4j
2)运维修改tomcat的server配置文件

#编辑tomcat配置文件
[root@elkstack03 ~]# vim conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".log"
pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>

2.通过Logstash其他模块来收集例:multiline多行匹配

以下是tomcat日志文件中exception展示


安装tomcat

安装JDK环境

下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

#解压JDK安装包
[root@elkstack03 ~]# tar xf jdk-8u121-linux-x64.tar.gz
#将JDK安装包移动到安装目录下
[root@elkstack03 ~]# mv jdk1.8.0_121 /usr/local/
#做软链接(方便日后升级)
[root@elkstack03 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8
#添加环境变量
[root@elkstack03 ~]# vim /etc/profile.d/jdk1.8.sh
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#加载环境变量
[root@elkstack03 ~]# source /etc/profile
#检查是否加载成功
[root@elkstack03 ~]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

安装tomcat

#解压tomcat安装包
[root@elkstack03 ~]# tar xf apache-tomcat-8.0.38.tar.gz
#将安装包移动到安装路径并改名
[root@elkstack03 ~]# mv apache-tomcat-8.0.38 /usr/local/tomcat-8.0.38
#做软链接
[root@elkstack03 ~]# ln -s /usr/local/tomcat-8.0.38 /usr/local/tomcat
#进入tomcat站点目录
[root@elkstack03 ~]# cd /usr/local/tomcat/webapps/
#创建新项目目录
[root@elkstack03 webapps]# mkdir webdir
#写一个测试页面到站点目录下的index.html文件中
[root@elkstack03 webapps]# echo 'zls tomcat page' > webdir/index.html
#进入tomcat程序目录
[root@elkstack03 webapps]# cd /usr/local/tomcat/bin/
#启动tomcat
[root@elkstack03 bin]# ./catalina.sh start
#检测tomcat端口是否启动
[root@elkstack03 bin]# netstat -lntup|grep 8080
tcp 0 0 :::8080 :::* LISTEN 12569/java

启动成功后,打开浏览器,访问:http://10.0.0.53:8080/webdir/


修改tomcat日志格式
#进入tomcat配置文件目录
[root@elkstack03 ~]# cd /usr/local/tomcat/conf
#编辑server配置文件
[root@elkstack03 conf]# vim server.xml
#在138行,添加如下内容
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".log"
pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
#进入tomcat程序目录
[root@elkstack03 conf]# cd /usr/local/tomcat/bin/
#停止tomcat
[root@elkstack03 bin]# ./catalina.sh stop
#启动tomcat
[root@elkstack03 bin]# ./catalina.sh start
#进入tomcat日志目录
[root@elkstack03 bin]# cd /usr/local/tomcat/logs/
#查看新生成的tomcat日志
[root@elkstack03 logs]# ll
总用量 40
-rw-r--r-- 1 root root 14601 3月 31 10:10 tomcat_access_log.2019-03-31.log
#实时跟进日志
[root@elkstack03 logs]# tail -f tomcat_access_log.2019-03-31.log

打开浏览器,访问:http://10.0.0.53:8080/webdir/


验证Json格式

复制一条日志,打开浏览器,访问:http://www.kjson.com/


配置Logstash收集tomcat日志输出到ES中
#进入Logstash配置文件目录
[root@elkstack03 logs]# cd /etc/logstash/conf.d/
#编辑Logstash配置文件
[root@elkstack03 conf.d]# vim tomcat_es.conf
#输入插件
input {
#文件模块
file {
#文件路径
path => "/usr/local/tomcat/logs/tomcat_access_log.2019-03-31.log"
#从结束位置点开始收集
start_position => "end"
#日志类型
type => "tomct_access_log"
}
}
#输出插件
output {
#ES模块
elasticsearch {
#主机信息
hosts => ["10.0.0.51:9200"]
#索引名称,也就是日志名称
index => "tomcat_access-%{+YYYY.MM.dd}"
#输出成json格式
codec => "json"
}
}
#启动Logstash
[root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tomcat_es.conf &

启动成功,如下图所示:

打开浏览器,访问:http://10.0.0.51:9100/ 查看是否生成日志,如果没有,则访问tomcat页面。

将tomcat日志索引添加到Kibana中

查看日志内容,不难发现,即便是用了Json格式的,所有日志在message中还是 一坨 看起来很麻烦,并不是以KEY:VALUE的形式展示出来的。

所以,我们需要获取到message中的KEY:VALUE将他解析成键值对的形式,展现出来

#在Logstash的配置文件中,添加filter过滤规则
filter {
json {
source => "message"
}
}
#重新启动Logstash
[root@elkstack03 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tomcat_es.conf &

再次查看日志内容

两条日志对比,可以看出修改后的Logstash日志,前面多出很多KEY,虽然还message里还是有一坨,但是message中的所有Json已经被解析出来变成了KEY:VALUE的形式,当然我们也可以取消message的显示,操作如下:

#讲Logstash中的filter规则添加一行,remove_field,删除列 message
filter {
json {
source => "message"
remove_field => ["message"]
}
}
#重新启动Logstash

再次查看日志,可以看到message已经没有了,但是所有的KEY:VALUE都还在。
为什么要这么做呢,一定要展示成Json格式呢?
因为,如果我们想要Kibana画图,那么必须用KEY:VALUE的形式,获取值,来画图。


使用multiline插件收集java日志

使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并,https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

因为目前tomcat日志中没有exception,所以,我们把Logstash部署在ES上,收集一下ES的java日志。

安装JDK环境

下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

#解压JDK安装包
[root@elkstack01 ~]# tar xf jdk-8u121-linux-x64.tar.gz
#将JDK安装包移动到安装目录下
[root@elkstack01 ~]# mv jdk1.8.0_121 /usr/local/
#做软链接(方便日后升级)
[root@elkstack01 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8
#添加环境变量
[root@elkstack01 ~]# vim /etc/profile.d/jdk1.8.sh
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#加载环境变量
[root@elkstack01 ~]# source /etc/profile
#检查是否加载成功
[root@elkstack01 ~]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

安装Logstash

下载地址: https://www.elastic.co/downloads/past-releases/logstash-5-3-0

#安装Logstash使用yum localinstall 自动安装依赖包
[root@elkstack03 ~]# yum localinstall -y logstash-5.3.0.rpm
#给Logstash目录授权
[root@elkstack03 ~]# chown -R logstash.logstash /usr/share/logstash/

测试标准输入标准输出多行匹配
#编辑Logstash配置文件
[root@elkstack03 ~]# vim /etc/logstash/conf.d/java.conf
input {
stdin {
codec => multiline {
#当遇到[开头的行时候将多行进行合并
pattern => "^\["
#true为匹配成功进行操作,false为不成功进行操作
negate => true
#与上面的行合并,如果是下面的行合并就是next
what => "previous"
}}
}
output {
stdout {
codec => rubydebug
}
}
#测试多行匹配数据
[root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/java.conf


测试将日志写入到文件中
[root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_file.conf
input {
file {
path => "/data/elk/logs/elk-cluster.log"
type => "es-log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}}
} output {
file {
path => "/tmp/es_log.txt"
}
}
#启动Logstash
[root@elkstack01 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_file.conf &


将结果输出到ES中
#编写Logstash配置文件
[root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_es.conf
input {
file {
path => "/data/elk/logs/elk-cluster.log"
type => "es-log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}}
}
output {
elasticsearch {
hosts => ["10.0.0.51:9200"]
index => "es_log_%{+YYYY.MM.dd}"
}
}
#启动Logstash
[root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_es.conf &

打开浏览器,访问:http://10.0.0.51:9100/

第六章·Logstash深入-收集java日志的更多相关文章

  1. 第七章·Logstash深入-收集NGINX日志

    1.NGINX安装配置 源码安装nginx 因为资源问题,我们先将nginx安装在Logstash所在机器 #安装nginx依赖包 [root@elkstack03 ~]# yum install - ...

  2. ELK学习实验017:filebeat收集java日志

    收集JAVA格式日志 1 查看Java格式日志 elasticsearch属于Java日志,可以收集elasticsearch作为Java日志范本 [root@node3 ~]# tail -f /u ...

  3. logstash收集java日志,多行合并成一行

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input { ...

  4. ELK之收集Java日志、通过TCP收集日志

    1.Java日志收集 使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 语法示例: inpu ...

  5. filebeat+logstash+elasticsearch收集haproxy日志

    filebeat用于是日志收集,感觉和 flume相同,但是用go开发,性能比较好 在2.4版本中, 客户机部署logstash收集匹配日志,传输到 kafka,在用logstash 从消息队列中抓取 ...

  6. 第六章:任务执行——Java并发编程实战

    任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性 ...

  7. nagios+logstash实时监控java日志(一)

    https://blog.csdn.net/yanggd1987/article/details/64121459

  8. 使用logstash收集java、nginx、系统等常见日志

    目录 1.使用codec的multiline插件收集java日志... 1 2.收集nginx日志... 2 3.收集系统syslog日志... 3 4.使用fliter的grok模块收集mysql日 ...

  9. 用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

    用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana ...

随机推荐

  1. Python--多任务(多进程,多线程,协程)

    1.单核CPU实现“多任务”:(注意:这里的多任务假的,是轮训执行多个任务一段时间) 1)时间片轮转 2)优先级调度算法 2.并行:真的多任务执行(CPU核数>=任务数):即在某个时刻点上,有多 ...

  2. Servlet(2):Requset/Response Encoding and Filter

    Requset/Response Encoding 表单提交分GET和POST,接下来分开讨论. (1)GET/URL提交的数据 在 Tomcat中,默认情况下使用"URIEncoding& ...

  3. gdb调试caffe工程

    环境:UBUNTU 16.04 CMake caffe 1.0.0-rc3 1.首先编译caffe为debug版本: 在caffe根目录下编辑CMakeFileList.txt,加入如下几行: SET ...

  4. vue的双向绑定和依赖收集

    在掘金上买了一个关于解读vue源码的小册,因为是付费的,所以还比较放心 在小册里看到了关于vue双向绑定和依赖收集的部分,总感觉有些怪怪的,然后就自己跟着敲了一遍. 敲完后,发现完全无法运行,  坑啊 ...

  5. idea的spring整合基于xml文件配置的mybatis报Invalid bound statement (not found): com.music.dao.MusicDao.findAll的问题

    一. 题主当时就是自己尝试整合spring和mybatis的时候遇到了这个问题,当时题主只看到了用注解的方式配置的dao层,题主用的是xml文件配置的形式, 而且坑爹的是题主的两个文件的路径写的也不一 ...

  6. 阿里RDS

    白名单设置: 创建高权限帐号:

  7. [Agc036D]Do Not Duplicate_链表_贪心_数论

    Do Not Duplicate 题目链接:https://atcoder.jp/contests/agc036/tasks/agc036_b 题解: 首先最后肯定至多只有$n$个数. 我们想处理出来 ...

  8. 题解 P3627 【[APIO2009]抢掠计划】

    咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...

  9. PHPstorm配置同步服务器文件

    一.配置服务器 1.连接配置 打开菜单栏 Tools -> Deployment -> Configuration 点击 + 选择 SFTP,并填写相关服务器信息: Type:连接类型,这 ...

  10. golang net包学习笔记

    阅读源代码发现在net包中主要实现了ip.tcp.udp.unix等通信方式.它们大致可以分成两大类:其一,ip.udp.unix(DGRAM),这是一些无链接的协议,其二,tcp.unix(STRE ...