logstash配置文件的写法解析

本文详细解析了Logstash的配置文件写法,涵盖了从手动输入log到从文件读取log,通过过滤器filter进行格式化,再到将数据输入Elasticsearch并在Kibana中展示。还介绍了日期格式化问题以及如何处理log文件的读取问题。
部署运行你感兴趣的模型镜像

手动输入log,终端打印出消息

/opt/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

然后你会发现终端在等待你的输入。没问题,敲入  test_str,回车,返回下面的结果就是OK的!

 

 

从test.conf文件中写入

一、最基础终端输入输出

input {
    stdin {
        add_field => {"key" => "value"}   #加上新的字段
        codec => "plain"
        tags => ["add"]     
        type => "std"
    }
}
output {
	stdout {
		codec => rubydebug
	}
}

然后运行:

/opt/logstash/bin/logstash -f /opt/conf/test.conf --config.reload.automatic

显示结果:

二、加上过滤filter,可以移除或者格式化成想要的格式的消息

input {
   stdin{
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std"
   }
}
filter{
    date{
        match => ["datetime", "yyyy-MM-dd HH:mm:ss,SSS"]
        target => "@timestamp"
    }
    mutate {
      # 移除不需要看到的消息
      remove_field => ["host", "tags", "@version", "type"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
}

 TIPS:

  1. host 标记事件发生在哪里。
  2. type 标记事件的唯一类型。
  3. tags 标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。

三、输入到elasticsearch中,并且在kabana中展示数据。

input {
    stdin {
        type => "test"
        tags => ["wq"]
    }
}
filter{
    date{
        match => ["datetime", "yyyy-MM-dd HH:mm:ss,SSS"]
        target => "@timestamp"
     }
}
output {
    if "wq" in [tags] {
        elasticsearch {
            index => "log-2019-12-20_wang"
            hosts => ["127.0.0.1:9200"]
        }
        stdout {
            codec => rubydebug
        }
    }
}

终端正常打印

并且elasticsearch中接收到并在kibana(http://ip:5601)中展示相关数据

四、从log文件中读取数据并且展示到kibana上

 test.conf文件中内容:

input {
    file {
        path => "/opt/logs/access.log"  # 填写容器内部log文件路径
        start_position => "beginning"   # 从文件开始处开始读取
        type => "elasticsearch"
    }
}
filter{
    date{
        match => ["datetime", "yyyy-MM-dd HH:mm:ss,SSS"]
        target => "@timestamp"
    }
    mutate {
      # 屏蔽掉不想要的属性
      remove_field => ["host", "@version", "_id", "_score"]
    }
}
output {
    if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags]{
        elasticsearch {
            index => "log-2019-12-20_wang"
            hosts => ["127.0.0.1:9200"]
        }
        stdout {
            codec => rubydebug
        }
    }
}

 access.log 文件中内容为:test_access.log

终端打印出log文件中的内容,存放在message中,并且如愿屏蔽掉一些属性("host", "@version", "_id", "_score"):

存放到elasticsearch中,并且在kibana上显示,屏蔽掉一些属性("host","@version"),添加一条文件路径属性(path):

五、使用grok插件格式化数据,并展示到页面上

test.conf中的配置:

input {
    file {
        path => "/opt/logs/access.log"  # 填写容器内部log文件路径
        start_position => "beginning"   # 从文件开始处开始读取
        type => "elasticsearch"
        sincedb_path => "/dev/null"
    }
}
filter {
  grok {
    match => [ "message", "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" ]
  }
}

output {
        elasticsearch {
            index => "log-2019-12-20_wang"
            hosts => ["127.0.0.1:9200"]
        }
        stdout {
            codec => rubydebug
        }
   
}
root@3a718e715b4c:/# cat /opt/logs/access.log
192.168.194.6 GET /index.html 15824 0.043

执行命令后:

/opt/logstash/bin/logstash -f /opt/conf/test.conf --config.reload.automatic

可以看到message中的内容分解成了单独的属性展示出来,这就是格式化成功了。

==========================================================================================

TIPS:在test.conf配置文件的时候,在使用file,从log文件中读取文件的时候,有一个小坑:

input {
    file {
        path => "/opt/logs/access.log"  # 填写容器内部log文件路径
        start_position => "beginning"   # 从文件开始处开始读取
        type => "elasticsearch"
        sincedb_path => "/dev/null"     #强制从头开始读文件,没有这行就读不出文件
    }
}

sincedb_path => "/dev/null"     #当日志内容没有变更时,从头开始读文件

在你第一次配置时,运行logstash对日志文件进行的读取操作,然后输出到了控制台,这个过程logstash会记录自己读取完日志文件的位置,然后将自己读取内容的偏移量保存到一个隐藏文件中(默认位置是~/.sincedb_****文件);当我们配置了filer之后,启动logstash后,logstash从隐藏文件中的读取完成的日志文件位置知道,日志文件并没有发生改变。所以,logstash并没有对日志文件再次进行读取,所以控制台没有任何输出。

但是如果我们设置为 /dev/null这个 Linux 系统上特殊的空洞文件,那么 logstash 每次重启进程的时候,尝试读取 sincedb 内容,都只会读到空白内容,也就会理解成之前没有过运行记录,自然就从初始位置开始读取了!

六、收集并展示nginx产生的log日志

 安装配置好nginx后(安装配置nginx可以看参照https://blog.youkuaiyun.com/qq_40673345/article/details/103661210),编辑配置文件: 

vim /usr/local/nginx/conf/nginx.conf

 在http里面加上:

    log_format json '{"@timestamp":"$time_iso8601",'
                    '"@version":1,'
                    '"host":"$server_addr",'
                    '"client":"$remote_addr",'
                    '"size":$body_bytes_sent,'
                    '"responsetime":$request_time,'
                    '"domain":"$host",'
                    '"url":"$uri",'
                    '"status":"$status"}';

    access_log /opt/elk-data/logs/access.log  json;

配置截图如下:

复制会话,打开另一个终端,使用如下命令开启nginx:

curl localhost:80

会出现:

查看access.log文件中是否收集到日志:

cat /opt/elk-data/logs/access.log

会出现:

说明日志收集成功,然后将logstash 的配置文件加上filter

input {
    file {
        path => "/opt/logs/access.log"  # 填写容器内部log文件路径
        start_position => "beginning"   # 从文件开始处开始读取
        type => "elasticsearch"
        sincedb_path => "/dev/null"
    }
}
filter {
    json{
	source => "message"
    }
}
output {
        elasticsearch {
            index => "log-2019-12-20_wang"
            hosts => ["127.0.0.1:9200"]
        }
        stdout {
            codec => rubydebug
        }
   
}

运行logstash,终端打印出日志内容:

/opt/logstash/bin/logstash -f /opt/conf/test.conf --config.reload.automatic

kibana也正常显示:

 

 

 

 

 

 

==========================================================================================

关于logstash的日期格式化

logstash.conf:

input {
    file {
        path => "/opt/logs/access.log"  # 填写容器内部log文件路径
        start_position => "beginning"   # 从文件开始处开始读取
        type => "elasticsearch"
        sincedb_path => "/dev/null"
    }
}
filter {
    json{
        source => "message"
    }
    # 获取当天的日期
    ruby {
        code => "event.set('index_time',event.timestamp.time.localtime.strftime('%Y.%m.%d'))"
    }
}
output {
    if "_jsonparsefailure" not in [tags] and "_dateparsefailure" not in [tags]{
        elasticsearch {
            # 赋值到index中
            index => "bosslove-test-%{index_time}"
            hosts => ["127.0.0.1:9200"]
        }
        stdout {
            codec => rubydebug
        }
   }
}

access.log:

[root@localhost ~]# cat /opt/elk-data/logs/access.log 

{"@timestamp":"2019-12-24T17:30:38+08:00","@version":1,"host":"127.0.0.1","client":"127.0.0.1","size":612,"responsetime":0.000,"domain":"localhost","url":"/index.html","status":"200"}

终端打印:

kibana显示:

删除log中的timestamp后发现,table里面的timestamp就是比json里的多八小时

原因在于centos的系统时间和我们的网络时间不一致,需要同步网络时间

(参考:https://blog.youkuaiyun.com/qq_40673345/article/details/103684318

NTP同步后,kibana的时间就是当前时间了

下面截图的红框标出的,上面的时间是logstash日志上传到elasticsearch的时间,下面的时间是nginx启动时上传日志的时间。虽然两个时间一致,但是意义不一样。

 

==========================================================================================

 

 

持续更新中…………………………

 

 

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值