【星海出品】LogStash

智谱清言
ZhipuAI

LogStash | Fluentd

Logstash 依赖于JAVA
Oracle 修复了 Java 超过一半的问题。所以我们到Oracle 官方网站上下载 java 的JDK,安装方法见之前的文档

LogStash 的核心价值就在于它将业务系统和数据展示系统隔离开来,屏蔽了各自系统变化对彼此的影响,使系统之间的依赖降低并可独自进化发展。
LogStash 可以从多个数据源提取数据,然后再清洗过滤并发送到指定的目标数据源。目标数据源也可以是多个,而且只要修改 LogStash 管道配置就可以轻松扩展数据的源头和目标。

LogStash 读取大文件主要通过其内部的一个关键组件——FileWatch Ruby Gem库。
这个库使得LogStash能够监听文件变化,并高效地读取大文件内容。

LogStash 使用 FileWatch 库来监听指定路径下的文件变化。
FileWatch 支持 glob 展开文件路径,这意味着可以指定通配符(如*.log)来匹配多个文件。

为了避免在读取大文件时漏掉数据,FileWatch 会记录一个 .sincedb 的数据库文件。
.sincedb 文件中记录了每个被监听的文件的 inode、major number、minor number 和当前读取位置(pos)。

LogStash 可以选择 tail 模式或 read 模式来读取文件。
Tail 模式:当文件有新数据写入时,LogStash 会继续从上一次读取的位置开始读取。
Read 模式:LogStash 会一次性读取整个文件内容,并在读取完成后关闭文件。
通过设置 close_older 参数,可以指定在读取文件后多久关闭文件。这有助于管理打开的文件句柄数量。

logstash可以通过设置 close_older 参数,可以指定在读取文件后多久关闭文件。这有助于管理打开的文件句柄数量。

input {  
  file {  
    path => "/var/log/myapp/*.log"  
    start_position => "beginning"  
    sincedb_path => "/dev/null" # 或者其他路径来存储sincedb文件  
    close_older => "5 minutes" # 5分钟后没有新日志则关闭文件句柄
    # close_older参数默认值是3600秒(即一小时)
    # discover_interval 默认15秒
  }  
}  
  
filter {  
  # ... 你的过滤配置 ...  
}  
  
output {  
  # ... 你的输出配置 ...  
}
%{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} %{NUMBER:bytes:int} "%{GREEDYDATA:referrer}" "%{GREEDYDATA:agent}"

Xxx/logstash-xxx/vendor/bundle/jruby/xxx/gems/logstash-patterns-core-4.1.2/patterns

USER_IPADDRESS   ([0-9\.]+)\s+
DATETIME  ([0-9\-]+\s[0-9\:]+)\s+
METHOD  ([A-Z]+)\s+
URL ([\/A-Za-z0-9\.]+)\s+
STATUS  ([0-9]+)\s+
REQUEST_SEND  ([0-9]+)\s+
REQUEST_TIME  ([0-9\.]+)
grok {
  Patterns_dir => [“./patterns”]
    Match => {
        “message” => “%{USER_IPADDRESS:user_ip} %{DATETIME:date}  %{METHOD:method}    ”
  }
}
性能优化:

对于大文件,性能是关键。LogStash 提供了一系列配置选项来优化读取性能,如设置 discover_interval 来控制多久检查一次新文件,使用 exclude 参数来排除不需要的文件等。
还可以通过调整 JVM 堆内存大小、工作线程数等参数来进一步提高 LogStash 的性能。

Ibana

基础使用Management Dev Tools 的 Console

GET _search
{
  "query": {
    "match_all": {}
  }
}
#查看索引列表
GET _cat/indices

#查看索引
GET /_cat/indices?v

# 查看所有的log开头的索引信息
GET log*/_search  
{  
  "query": {  
    "match_all": {}  
  }  
}

#查看特定的log索引信息
GET logstash-20240621/_search
{  
  "query": {  
    "match_all": {}  
  }  
}

GET kibana_sample_data_logs/_search
{  
  "query": {  
    "match_all": {}  
  }  
}

PUT http://localhost:9200/{索引名}
#创建索引

#创建索引为logstash-20240620名字的索引
PUT /logstash-20240620

# 查看索引的设置
GET /index_search/_settings

# 查看整个集群健康状态
GET _cat/health

精确查询
{
“query”: {
“term”: {
“field_name”: “exact_value”
}
}
}
多匹配
{
“query”: {
“terms”: {
“field_name”: [“value1”, “value2”]
}
}
}

Ibana 使用 Management -> Dev Tools -> Grok Debugger 进行调试。

  • Sample Data

172.16.1.60 - - [20/Jun/2024:02:51:00 +0000] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36”

  • Grok Pattern

%{IPORHOST:clientip} - - [%{HTTPDATE:timestamp}] “%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}” %{NUMBER:response:int} %{NUMBER:bytes:int} “%{GREEDYDATA:referrer}” “%{GREEDYDATA:agent}”

  • Result

{
“request”: “/”,
“agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36”,
“verb”: “GET”,
“referrer”: “-”,
“response”: 304,
“bytes”: 0,
“clientip”: “172.16.1.60”,
“httpversion”: “1.1”,
“timestamp”: “20/Jun/2024:02:51:00 +0000”
}

  • Custom

USER_IPADDRESS ([0-9.]+)\s+
DATETIME ([0-9-]+\s[0-9:]+)\s+
METHOD ([A-Z]+)\s+
URL ([/A-Za-z0-9.]+)\s+
STATUS ([0-9]+)\s+
REQUEST_SEND ([0-9]+)\s+
REQUEST_TIME ([0-9.]+)

#grok示例:

https://help.aliyun.com/zh/sls/user-guide/grok-patterns

  • data

%{IPORHOST:ip} %{Scheme:scheme} “%{Method:method} %{Path:path}” %{Code:port} %{BASE10NUM:bytes} “%{Agent:agent}” “%{Proxy:proxy}”

  • custom template

Scheme [a-z]+
Method [A-Z]+
Path [0-9a-zA-Z/.]+
Agent [\s\S]+
Proxy [0-9,.]+
Code [0-9]+

filter {
grok {
patterns_dir => [“./patterns”]
match => { “message” => “{IPORHOST:user_ip}” }
}
}

语法解释:
%{HOSTNAME},匹配请求的主机名
%{TIMESTAMP_ISO8601:time},代表时间戳
%{LOGLEVEL},代表日志级别
%{URIPATHPARAM},代表请求路径
%{INT},代表字符串整数数字大小
%{NUMBER}, 可以匹配整数或者小数

%{UUID},匹配类似091ece39-5444-44a1-9f1e-019a17286b48
%{IP}, 匹配ip
%{WORD}, 匹配请求的方式
%{GREEDYDATA},匹配所有剩余的数据
(?([\S+]*)),自定义正则
\s*或者\s+,代表多个空格
\S+或者\S*,代表匹配多个字符

\w+或者\w*,代表匹配多个字母
大括号里面:xxx,相当于起别名

(?<class_info>\S+)或者(?<class_info>([\S+]*)), 自定义正则匹配多个字符

fluentd

<source>
  @type tail
  path /var/log/application.log
  pos_file /var/log/application.log.pos
  tag application.log
  format json
</source>
 
<match application.log>
  @type elasticsearch
  host elasticsearch_host
  port elasticsearch_port
  index_name application_index
  type_name log
  logstash_format true
  flush_interval 10s
</match>

fluentd -c /path/to/your/fluentd.conf

apt-get install ruby
apt-get install fluentd

相对logstash更轻量。功能支持插件模式

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值