centos环境推荐用yum安装的方式,至于其他方式,请关注官方文档(https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)
rpm --
import
https:
//artifacts.elastic.co/GPG-KEY-elasticsearch
|
添加如下内容,到vi /etc/yum.repos.d/logstash.repo
目录,以.repo结尾,推荐为:
[logstash-
5
.x]
name=Elastic repository
for
5
.x packages
baseurl=https:
//artifacts.elastic.co/packages/5.x/yum
gpgcheck=
1
gpgkey=https:
//artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=
1
autorefresh=
1
type=rpm-md
|
sudo yum install logstash
|
vi /etc/logstash/conf.d/syslog.conf
elasticsearch
查看index
curl 'localhost:9200/_cat/indices?v'
删除index
curl -X DELETE 'localhost:9200/sdf-hdfs-audit-2017.04*'
启动项目
systemctl start logstash.service
配置参考文件
filter {
grok {
match => { "path" => "/usr/local/test/logs/%{DATA:fileName}.log"} #获取log文件名
}
if [message] =~ ".*Exception.*" { # 格式化日志信息
grok {
match => { "message" => ".*%{LOGLEVEL:priority}.*uid=%{NUMBER:uid},traceId=%{DATA:traceId} .*\(%{DATA:method}@%{DATA:class}\.java:%{NUMBER:line}\)" }
}
}
else {
grok {
mutate { replace => { "type" => "apache_access" } }
match => {" message " => "\s*\[impl\]\[in\]requestId=%{NUMBER:reqId},reqTime=%{NUMBER:reqTime} req=%{GREEDYDATA:req}" } # 会自动生成相应的JSON的_source的key-value
}
}
}
正则匹配测试
http://grokdebug.herokuapp.com 预先检验grok的正则匹配是否正确
input {
# 略
}
filter {
grok {
match => { "message" => "\s*\[impl\]\[in\] traceId=%{NUMBER:traceId},reqTime=%{NUMBER:reqTime} req=%{GREEDYDATA:req}" }
# remove_field => [ "message" ]
}
if [priority] == "ERROR" { #是错误 添加标记
grok {
tag_on_failure => "error"
}
}
# 计数
metrics {
# 每60秒清空计数器 #should be a multiple of 5s
clear_interval =>60
# 每隔60秒统计一次 #Must be a multiple of 5s
flush_interval =>60
# 计数器数据保存的字段名 priority的值默认就有 是日志的级别
meter => "events_%{priority}"
# 增加"metric",作为标记
add_tag => "metric"
# 3秒内的message数据才统计,避免延迟
# ignore_older_than => 3
}
# 如果event中标记为“metric”的
if "metric" in [tags] {
# 执行ruby代码
ruby {
# 如果level为warn的数量小于3条,就忽略此事件(即不发送任何消息)。
code => "event.cancel if event['events_WARN']['count'] < 3"
}
}
}
output {
# 如果event中标记为“metric”,表示只发送计数的消息。
if "metric" in [tags]{
# 通过http请求公众号发送微信消息。(此处简略描述)
http {
http_method => "post"
url => "http://116.1.1.112:33333/xxx?count=%{[events_WARN][count]}"
}
}
stdout { codec => rubydebug } # 标准输出
# elasticsearch {
# action => "index" #The operation on ES
# hosts => "127.0.0.1:9344" #ElasticSearch host, can be array.
# index => "logstash-%{+YYYY.MM.dd}" #The index to write data to.
# }
}
# input 与 filter 参考上面的
output {
# 如果event中标记为“error”,表示出错
if "error" in [tags] {
email {
from => "[email protected]"
to => "[email protected]"
via => "smtp"
port => 25
subject => "[%{@timestamp} xxx服务器 日志发现异常!]"
address => "smtp.163.com"
domain => "smtp.163.com"
body => "u have new bug ! %{message}"
username => "[email protected]"
password => "password"
}
}
stdout { codec => rubydebug }
}
filter {
if [message] =~ "\s*(Arithmetic|Runtime)Exception\s*" {
ruby {
code => “”
add_tag => "specific_exeception"
}
}
grok {
match => { "message" => "\s*\[impl\]\[in\] traceId=%{NUMBER:traceId},reqTime=%{NUMBER:reqTime} req=%{GREEDYDATA:req}" }
}
if [priority] == "ERROR" {
grok {
tag_on_failure => "error"
}
}
}
file { path => "/data/web/logstash/logFile/*/*" start_position => "beginning" #从文件开始处读写 } * 有一些比较有用的配置项,可以用来指定 FileWatch 库的行为: discover_interval logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒。 exclude 不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开。 sincedb_path 如果你不想用默认的 $HOME/.sincedb(Windows 平台上在C:\Windows\System32\config\systemprofile\.sincedb),可以通过这个配置定义 sincedb 文件到其他位置。 sincedb_write_interval logstash 每隔多久写一次 sincedb 文件,默认是 15 秒。 stat_interval logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。 start_position logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。如果你是要导入原有数据,把这个设定改成 "beginning",logstash 进程就从头开始读取,有点类似cat,但是读到最后一行不会终止,而是继续变成 tail -F。