童装东莞网站建设技术支持,网站开发需要的准备,温州做网站哪家比较好,做移动网站优化排名首页文章目录 ELK整合实战使用FileBeats将日志发送到Logstash配置Logstash接收FileBeat收集的数据并打印Logstash输出数据到Elasticsearch利用Logstash过滤器解析日志Grok插件Grok语法用法 输出到Elasticsearch指定索引 前文#xff1a;FileBeats详解 前文#xff1a;logstash详解… 文章目录 ELK整合实战使用FileBeats将日志发送到Logstash配置Logstash接收FileBeat收集的数据并打印Logstash输出数据到Elasticsearch利用Logstash过滤器解析日志Grok插件Grok语法用法 输出到Elasticsearch指定索引 前文FileBeats详解 前文logstash详解 ELK整合实战
案例采集SpringBoot应用日志
一个springboot应用打了一个jar包使用nohup java -jar XXX.jar 运行
日志内容如下所示
2024-08-16 16:04:04.605 INFO 9164 --- [nio-8081-exec-1] com.hs.single.controller.UserController : 请求参数为1
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession4196ffc2] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl790df42b] will not be managed by SpringPreparing: SELECT id,username,password,name,description,status,create_time,update_time FROM sys_user WHERE id?Parameters: 1(Long)Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession4196ffc2]使用FileBeats将日志发送到Logstash
创建配置文件filebeat-logstash.yml配置FileBeats将数据发送到Logstash
vim filebeat-logstash.yml#因为Tomcat的web log日志都是以IP地址开头的我们应用日志一般是以日期时间开头。所以我们需要修改下匹配字段。
# 不以日期时间开头的行追加到上一行
filebeat.inputs:
- type: logenabled: truepaths:- /root/application/nohup.outmultiline.pattern: ^\d{4}-\d{2}-\d{2}multiline.negate: truemultiline.match: afteroutput.logstash:enabled: truehosts: [192.168.75.65:5044]
pattern正则表达式negatetrue 或 false默认是false匹配pattern的行合并到上一行true不匹配pattern的行合并到上一行matchafter 或 before合并到上一行的末尾或开头
# 启动可能会报错 因为安全原因不要其他用户写的权限去掉写的权限就可以了
chmod 644 filebeat-logstash.yml启动FileBeat并指定使用指定的配置文件
# -e 前台运行 -c 指定配置文件
./filebeat -e -c filebeat-logstash.yml可能出现的异常
Exiting: error loading config file: config file (filebeat-logstash.yml) can only be writable by the owner but the permissions are -rw-rw-r-- (to fix the permissions use: chmod go-w /home/es/filebeat-7.17.3-linux-x86_64/filebeat-logstash.yml)因为安全原因不要其他用户写的权限去掉写的权限就可以了 Failed to connect to backoff(async(tcp://192.168.75.65:5044)): dial tcp 192.168.75.65:5044: connect: connection refusedFileBeat将尝试建立与Logstash监听的IP和端口号进行连接。但此时我们并没有开启并配置Logstash所以FileBeat是无法连接到Logstash的。 配置Logstash接收FileBeat收集的数据并打印
输入的使用5044端口接收输入输出是直接在控制台打印查看是否能正常接收数据
vim config/filebeat-console.conf
# 配置从FileBeat接收数据
input {beats {port 5044}
}output {stdout {codec rubydebug}
}启动logstash
# -t检查配置文件是否存在语法错误
[rooths-es-node1 logstash-7.17.3]# bin/logstash -t -f config/filebeat-console.conf
[rooths-es-node1 logstash-7.17.3]# bin/logstash -f config/filebeat-console.conf调用接口filebeat成功将数据发送至logstash中 Logstash输出数据到Elasticsearch
如果我们需要将数据输出值ES而不是控制台的话我们修改Logstash的output配置。
vim config/filebeat-elasticSearch.conf
input {beats {port 5044}
}output {elasticsearch {hosts [http://192.168.75.65:9200]user elasticpassword 123456}stdout{codec rubydebug}
}启动logstash
# -t检查配置文件是否存在语法错误
[rooths-es-node1 logstash-7.17.3]# bin/logstash -t -f config/filebeat-elasticSearch.conf
[rooths-es-node1 logstash-7.17.3]# bin/logstash -f config/filebeat-elasticSearch.confES中会生成一个以logstash开头的索引测试日志是否保存到了ES。 思考日志信息都保证在message字段中是否可以把日志进行解析一个个的字段例如时间、日志级别、哪个类打印的日志、日志具体内容。 利用Logstash过滤器解析日志
在Logstash中可以配置过滤器Filter对采集到的数据进行过滤处理Logstash中有大量的插件可以供我们使用。
# 查看Logstash已经安装的插件,默认已经安装了grok插件
[rooths-es-node1 logstash-7.17.3]# bin/logstash-plugin listGrok插件
Grok是一种将非结构化日志解析为结构化的插件。这个工具非常适合用来解析系统日志、Web服务器日志、MySQL或者是任意其他的日志格式。
https://www.elastic.co/guide/en/logstash/7.17/plugins-filters-grok.html Grok语法
Grok是通过模式匹配的方式来识别日志中的数据,可以把Grok插件简单理解为升级版本的正则表达式。它拥有更多的模式默认Logstash拥有120个模式。如果这些模式不满足我们解析日志的需求我们可以直接使用正则表达式来进行匹配。
grok模式的语法是
# SYNTAX语法指的是Grok模式名称SEMANTIC语义是给模式匹配到的文本字段名。
# 注意这中间不要有空格
%{SYNTAX:SEMANTIC}# 案例 duration表示匹配一个数字client表示匹配一个IP地址。
%{NUMBER:duration} %{IP:client}默认在Grok中所有匹配到的的数据类型都是字符串如果要转换成int类型目前只支持int和float可以这样
%{NUMBER:duration:int} %{IP:client}常用的Grok模式
https://help.aliyun.com/document_detail/129387.html?scm20140722.184.2.173 用法
比如tomacat日志
192.168.65.103 - - [23/Jun/2022:22:37:23 0800] GET /docs/images/docs-stylesheet.css HTTP/1.1 200 5780字段名说明client IP浏览器端IPdate请求的时间戳method请求方式GET/POSTuri请求的链接地址status服务器端响应状态length响应的数据长度
%{IP:ip} - - \[%{HTTPDATE:date}\] \%{WORD:method} %{PATH:uri} %{DATA:protocol}\ %{INT:status} %{INT:length} 为了方便测试我们可以使用Kibana来进行Grok开发 我们现在的日志和对应的grok语法
2024-08-16 16:04:04.605 INFO 9164 --- [nio-8081-exec-1] com.hs.single.controller.UserController : 请求参数为1%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{INT:thread} --- \[%{NOTSPACE:serverPort}\] %{JAVACLASS:class} : %{GREEDYDATA:logResult}修改Logstash配置文件
vim config/filebeat-elasticSearch.confinput {beats {port 5044}
}# 添加下面的filter
# 因为我们的消息是保存在message字段中所以下面主要就是匹配message字段中的值
filter {grok {match { message %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{INT:thread} --- \[%{NOTSPACE:serverPort}\] %{JAVACLASS:class} : %{GREEDYDATA:logResult} }}
}output {stdout {codec rubydebug}
}启动logstash测试
# --config.reload.automatic修改了配置文件能热加载
bin/logstash -f config/filebeat-elasticSearch.conf --config.reload.automatic使用mutate插件过滤掉不需要的字段
mutate {enable_metric falseremove_field [message, log, tags, input, agent, host, ecs, version]
}如果要将日期格式进行转换我们可以使用Date插件来实现。该插件专门用来解析字段中的日期官方说明文档https://www.elastic.co/guide/en/logstash/7.17/plugins-filters-date.html
用法如下 将date字段转换为「年月日 时分秒」格式。默认字段经过date插件处理后会输出到timestamp字段所以我们可以通过修改target属性来重新定义输出字段。
# [字段名当前时间格式修改后的时间格式] 我们这里可以不用改但是需要了解这个功能
date {match [date,dd/MMM/yyyy:HH:mm:ss Z,yyyy-MM-dd HH:mm:ss]target date
}输出到Elasticsearch指定索引
index来指定索引名称默认输出的index名称为logstash-%{yyyy.MM.dd}。
但注意要在index中使用时间格式化filter的输出必须包含 timestamp字段否则将无法解析日期。
output {elasticsearch {hosts [http://192.168.75.65:9200]index app_web_log_%{YYYY-MM-dd}user elasticpassword 123456}stdout{codec rubydebug}
}注意index名称中不能出现大写字符 完整的Logstash配置文件
input {beats {port 5044}
}filter {grok {match {message %{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{INT:thread} --- \[%{NOTSPACE:serverPort}\] %{JAVACLASS:class} : %{GREEDYDATA:logResult}}}mutate {enable_metric falseremove_field [message, log, tags, input, agent, host, ecs, version]}# 我们这里可以不用改但是需要了解这个功能#date {# match [date,dd/MMM/yyyy:HH:mm:ss Z,yyyy-MM-dd HH:mm:ss]# target date#}
}output {elasticsearch {hosts [http://192.168.75.65:9200]index app_web_log_%{YYYY-MM-dd}user elasticpassword 123456}stdout{codec rubydebug}
}