手动输入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:
- host 标记事件发生在哪里。
- type 标记事件的唯一类型。
- 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启动时上传日志的时间。虽然两个时间一致,但是意义不一样。

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

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

743

被折叠的 条评论
为什么被折叠?



