第七章 Logstash深入-收集java日志

2023-10-27

通过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页面。


使用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/

转载于:https://www.cnblogs.com/martin-wang/p/10656693.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第七章 Logstash深入-收集java日志 的相关文章

  • Java无法读取字体

    好的 我在使用自定义字体时遇到问题 基本上我得到了从互联网上下载的自定义字体并在我的程序中使用它 当我在 Eclipse 我使用的编辑器 中运行该程序时 一切正常 没有问题 但是 每当我将它从 eclipse 导出到 jar 时 或者尝试从
  • Java如何重写抽象类中的可选方法?

    假设我们有一个基类 public abstract class BaseFragment extends Fragment protected abstract boolean postExec 然后从它派生出其他类 例如 Fragment
  • 如何选择主题与队列

    当我们设计应用程序时如何选择Topic Queue类型实现 我知道 a 如果有多个消费者使用该消息 则使用 Topicb 如果只有一个消费者则使用Queue 请提供更多需要考虑的点 比如并发 消息持久化 负载均衡等等 Thanks Rw 如
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • JFreeChart 更改现有条形图中的数据

    我想循环更改条形图数据 但我不知道该怎么做 我的代码 DefaultCategoryDataset barChartData new DefaultCategoryDataset barChartData setValue 0 Values
  • Run As JUnit 未出现在 Eclipse 中 - 使用 JUnit4

    我正在尝试为我的 Web 应用程序编写 JUnit4 测试 它们之前一直工作正常 但是 现在当我尝试通过右键单击类文件 gt Run As gt JUnit Test 来运行测试时 我看不到该选项 我认为这可能是因为一位同事意外提交了一些
  • 获取 Spring Boot 中当前活动数据源的引用

    我想通过实现数据库数据初始化DataSourceInitializer 我将这些方法放在我的 Spring Boot 主方法下面 但似乎它根本没有被执行 我尝试故意删除字符只是为了触发一个错误来确认执行 什么也没有发生 Configurat
  • Log4j 2.x 如何实现惰性参数求值?

    鉴于Java 参数评估机制 http docs oracle com javase specs jls se8 html jls 15 html jls 15 12 4 2 如何Log4j 2 x实施惰性评估 https logging a
  • java应用程序,线程在终止MySQL连接后挂起

    我有一些工作线程正在运行 其中包括 MySQL 和 mysql connector java 5 1 20 当我杀死一些 SQL 语句 使用 mysql 客户端的kill 连接id 时 java线程挂起 这应该抛出一些异常 jstack 打
  • Selenium 和 xpath:查找带有类/id 的 div 并验证其中的文本

    我正在努力拥有xpath find a div并验证div有一个特定的string里面的文字 这是HTML div class Caption Model saved div and div class gwt HTML sfnStanda
  • Java 多态性中的字段如何工作? [复制]

    这个问题在这里已经有答案了 我正在读书面试问题 http javabypatel blogspot in 2016 04 java interview questions html关于java 发现了很好的例子 但感到困惑 因为没有很好 更
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • StringBuilder - 重置或创建新的

    我有一个条件 StringBuilder 不断存储与大型平面文件 数百 MB 中的模式匹配的行 但是 在达到条件后 我将 StringBuilder 变量的内容写入文本文件 现在我想知道是否应该通过重置对象来使用相同的变量 gt strin
  • 菜单项标题未显示

    菜单项的标题未显示在片段内 我在菜单文件中有两个项目 第一个是带有图标和标签的showAsAction always在工具栏中显示图标 第二个只有标题 我不知道这里出了什么问题 菜单项的所有操作均有效 例如下面 菜单 销售 xml menu
  • 如何显示 javadoc 代码块中的泛型?

    我有一个 javadoc 代码块 我想在其中编写一个包含泛型的代码示例 如下所示 public interface SomeInterface
  • 使用 ProGuard 混淆代码后如何保持 javadoc 可见?

    我使用 progured 4 7 混淆了我的代码 并保留了 A 类 其中包含描述该类功能的 javadoc keep public class com mysite ClassA public keepattributes InnerCla
  • JdbcTemplate queryForInt/Long 在 Spring 3.2.2 中已弃用。应该用什么来代替呢?

    JdbcTemplate 中的 queryforInt queryforLong 方法在 Spring 3 2 中已弃用 我无法找出为什么或什么被认为是使用这些方法替换现有代码的最佳实践 典型方法 int rowCount jscoreJd
  • DocumentBuilder 解析产生无效字节 2 of 4 字节 UTF-8 序列错误

    我正在尝试解析包含字符串的字节数组Impresi n in XML final DocumentBuilderFactory builderFactory DocumentBuilderFactory newInstance final D
  • Tomcat 中 JNDI 的 Java Mail API 配置文档

    我花了几天时间弄清楚如何通过 JNDI 在 Tomcat 中配置 javax mail Session有认证 现在我明白了 但只是在深入研究代码之后 这次我看到了有史以来最糟糕的代码 javax mail Service connect S
  • JFrame.repaint() 和 JPanel.repaint() 之间的区别

    谁能解释一下两者之间的区别JPanel repaint 方法和JFrame repaint 方法 我想两者都调用paintComponent JPanel 中的方法 请澄清 谢谢 Calling repaint 在任何组件上都会向重绘管理器

随机推荐

  • ChatGPT有哪些作用?

    ChatGPT有哪些作用 介绍 在当今信息技术飞速发展的时代 自然语言处理和人工智能已经成为许多领域的关键技术 ChatGPT是一种先进的语言生成模型 通过人工智能技术为用户提供了许多有用的功能和应用 本文将探讨ChatGPT的作用及其在不
  • 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 在上一篇文章中
  • 【浅学Java】Servlet详解

    Servlet详解 1 什么是Servlet 2 创建一个Servlet程序 1 创建项目 Maven 2 引入依赖 3 创建一些新目录 4 编写代码 5 打包 6 部署 7 验证程序 3 简化创建Servlet的步骤 1 安装plugin
  • .NET Desktop程序员:互联网大环境下软件生产力的创造者

    目录 引言 桌面软件如何适配今天的互联网 让 NET桌面软件工程拥有互联网基因 WebRuntime是什么 具体案例 让应用适配不同的应用场景 基于应用的Web页面 Cloud WinForm 强大的Web生产力 总结 引言 对每个 NET
  • 征服数据宇宙,新华三存储护卫队早有准备?

    999 往期 精 选
  • 【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

    文章目录 1 unordered map的介绍 2 unordered map的使用 2 1unordered map的构造函数 2 2unordered map的迭代器 2 3unordered map的容量和访问函数 2 4unorde
  • 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

    程序分析 用情况语句比较好 如果第一个字母一样 则判断用情况语句或if语句判断第二个字母 Monday Tuesday Wednesday Thursday Friday Saturday Sunday T 2 S 2 public cla
  • 计算机刚开始学什么时候,新手如何开始学电脑 新手学电脑从何入门

    虽然现在手机已经占据了互联网的半壁江山 但是生活中免不了需要接触电脑 用U盘拷贝份文件 用打印机打印份文档 在电脑上下载一首歌 电影 图片等 都离不开电脑 很多人觉得电脑跟自己无关 也许当你需要用的时候 才会觉得 书到用时方恨少 那么对于一
  • U-Boot 图形化配置及其原理

    目录 U Boot 图形化配置体验 如何使能dns 命令 menuconfig 图形化配置原理 make menuconfig 过程分析 Kconfig 语法简介 1 mainmenu 2 调用其他目录下的Kconfig 文件 3 menu
  • TypeError: buildURL is not a function

    报错图 uni app 使用axios发请求 运行到微信开发者工具报错 使用了网络上axios适配器方案 没有效果 问题没有解决 请求没发出去 这个问题已经解决uni app和微信开发者工具兼容axios 主页文章有仔细查看
  • java中的注释及其快捷键

    1 单行注释 快捷键 Ctrl 再次点击取消注释 2 多行注释 快捷键 Ctrl Shift 要取消注释只能手动删除 3 文档注释 内容 内容 内容 作用 为类或方法添加说明 快捷键 enter
  • sigmod 函数与softmax 函数对比

    sigmod 函数与softmax 函数之间既有类似 又有差异 是两种典型的深度神经网络的activation functions 通俗而言 sigmod 函数常用于二分类 softmax 函数常用于多分类 两者都起到了压缩的作用 sigm
  • 基于JAVA Seleium 的自动化测试

    目录 1 什么是Seleium 2 Selenium环境引入 3 selenium基本使用 4 框架优化 5 元素其他操作 6 关于获取不到元素 1 什么是Seleium Selenium是一个用于Web应用程序测试的工具 Selenium
  • Week5_Test2

    package JAVA API Test import com sun xml internal ws api model wsdl WSDLOutput import java io import java util Arrays au
  • django官网网址

    django官网网址 https www djangoproject com start overview https docs djangoproject com en dev ref models querysets django db
  • STC89C52原理

    STC89C52单片机介绍 STC89C52RC是STC公司生产的一种低功耗 高性能CMOS8位微控制器 具有8K字节系统可编程Flash存储器 STC89C52使用经典的MCS 51内核 标准功能 具有以下标准功能 8k字节Flash 5
  • c#的二进制序列化组件MessagePack介绍

    c 的序列化有多种 我一般喜欢用第三方组件 一个公共组件要拿出来用 而且支持很多语言 甚至以此谋生 肯定有其优势 有或者说存在必然有其合理性 经过几年开发 我更加喜欢第三方的东西 类似序列化的东西 开篇总是牢骚 大家要习惯哈 最近在写一个小
  • OpenWrt路由器——基础网络配置

    OpenWrt 路由器基础配置 基础配置方法 OpenWrt设置方法图解 WAN口配置 需要注意的是WAN口可以按默认协议配置DHCP客户端即可 若重启后发现网络无法正常上网 在WAN口选择桥接模式 即可解决问题 无线配置 可能会出现某个W
  • 高德地图 动态绘制多个路线轨迹

    最近在用高德地图的API 顺便记录下 平时我们只是通过如下代码 给path一串经纬度数组 静态绘制修改路径 但怎么才能通过接收数据 例如Json数据 来动态绘制 多个路径呢 这里有两种方法 设置数据 pathSimplifierIns se
  • 第七章 Logstash深入-收集java日志

    通过Logstash收集java日志并输出到ES中 因为我们现在需要用Logstash收集tomcat日志 所以我们暂时将tomcat安装到Logstash所在机器 也就是db03 10 0 0 53这台机器 收集tomcat访问日志以及t