输出插件(Output)

输出阶段:将处理完成的日志推送到远程数据库存储

常用插件:

• file

• Elasticsearch

输入插件:Elasticsearch

Elasticsearch插件:将数据推送到ES存储。

常用字段:

• hosts 指定ES主机地址

• index 指定写入的ES索引名称,一般按日期ec 划分

示例:

output {
elasticsearch {
hosts =>
["192.168.0.11:9200","192.168.0.12:9200","192.168.0.13:9200"]
index => "product-%{+YYYY.MM.dd}"
}
}

条件判断

操作符:

 比较操作符:== ,!= , < , > , <= ,>=

 正则匹配操作符:=~(匹配正则) ,!~(不匹配正则)

 成员操作符:in(包含) , not in(不包含)

 逻辑操作符:and(与),or(或), nand(非与) , xor(非或)

 一元运算符:!(取反) ,()(复合表达式) ,!()(对复合表达式结果取反)

条件判断语句:

if <表达式> {

 <语句> 

} else if <表达式> {

<语句> 

} else {

<语句>

}

典型的应用场景:

 根据日志来源(例如项目名称,应用名)字段写入不同索引名称

 根据日志来源(例如测试环境,生产环境)字段写入不同索引名称

mutate过滤器能够帮助你修改指定字段的内容。

@metadata 是logstash内部的一个元数据,这个数据不会写到es里面,一般用于临时存储一些数据,

比如是我们需要把数据写入到不同的索引中,同时我们也不想在es里多保存一个字段,一般用于filter中。

现在要做的就是将采集日志的来源放在不同的索引里面。如果不这样配置那么在logstash采集的日志都会输出到一个索引里面,这样是不利于对后期的管理的。因为索引相当于数据库,按天命名方便清理。把同类的日志放在同一个索引里面。

修改logstash配置文件

vim /opt/elk/logstash/conf.d/test.conf

input {
file {
path => "/var/log/test/test.log"
add_field => {
"log_type" => "test"
}
}
file {
path => "/var/log/test/prod.log"
add_field => {
"log_type" => "prod"
}
}
}
filter {
if [log_type] in ["test","dev"] {
mutate {
add_field => {
"[@metadata][target_index]" => "test-%{+YYYY.MM}"
}
}
} else if [log_type] == "prod" {
mutate {
add_field => {
"[@metadata][target_index]" => "prod-%{+YYYY.MM.dd}"
}
}
} else {
mutate {
add_field => {
"[@metadata][target_index]" => "unknown-%{+YYYY}"
}
}
}
}
output {
elasticsearch {
hosts => "192.168.0.11:9200"
index => "%{[@metadata][target_index]}"
}
}

热加载配置

kill -HUP <logstash pid>

模拟写入日志数据

echo "this is test" > /var/log/test/test.log 
echo "this is prod" > /var/log/test/prod.log

在kibana页面上查看

参考链接:

https://blog.csdn.net/qq_34624315/article/details/83013531

https://blog.csdn.net/qq_34556414/article/details/111955410

https://blog.csdn.net/wmg_fly/article/details/112171804