CentOS 7,Logstash6.3.2
Logstash:Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
本篇文章主要讲述Logstash的安装及相关配置
为了保持与Elasticsearch的版本一致,我们也选择版本6.3.2;我们可以从https://www.elastic.co/downloads选择要下载的版本链接:
# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.2.rpm
# rpm -hvi logstash-6.3.2.rpm
安装完成之后我们可以看到配置的路径为/etc/logstash;安装路径为/usr/share/logstash/;
首先我们进入到安装路径下可以看到相关配置文件:
# cd /etc/logstash/
# ls
conf.d jvm.options log4j2.properties logstash.yml pipelines.yml startup.options
一般测试时需要配置内存,默认内存为1g;
Logstash 通过管道进行运作,管道有两个必需的元素,输入和输出,还有一个可选的元素,过滤器。
输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。如下图:
这中间的配置都是通过日志解析文件来进行配置,日志解析配置文件的框架共分为三个模块:input,output,filter;
配置文件一般放在/etc/logstash/conf.d/目录下,配置文件的写法如下:
# 日志导入
input {
}
# 日志筛选匹配处理
filter {
}
# 日志匹配输出
output {
}
input 模块:
input模块下可以使用多个插件:如syslog、file、redis、beats等插件:
file插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html
input {
# file为常用文件插件,插件内选项很多,可根据需求自行判断,可同时配置多个
file {
# type字段,可表明导入的日志类型,这里的type,对应了ES中index中的type,即如果输入ES时,没有指定type,那么这里的type将作为ES中index的type。
type => "httpd_access"
# 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
path => "/etc/httpd/logs/access_log"
# 要排除的文件
Excude =>”*.gz”
#start_position可以设置为beginning或者end,beginning表示从头开始读取文件,end表示读取最新的,这个也要和ignore_older一起使用。
start_position => "beginning"
# ignore_older表示了针对多久的文件进行监控,默认一天,单位为秒,可以自己定制,比如默认只读取一天内被修改的文件,0为无限制,单位为秒
ignore_older => 0
# sincedb_path表示文件读取进度的记录,每行表示一个文件,每行有两个数字,第一个表示文件的inode,第二个表示文件读取到的位置(byteoffset)。默认为$HOME/.sincedb*;记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
sincedb_path => "/dev/null"
#这个值默认是\n 换行符,如果设置为空"",那么后果是每个字符代表一个event
delimiter => ""
}
file {
path => "/var/lib/mysql/slow.log"
start_position => "beginning"
ignore_older => 0
.....
}
}
redis插件配置详解:如下,可酌情选择进行配置可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
input {
# redis插件为常用插件,插件内选项很多,可根据需求自行判断
redis {
# EVAL命令返回的事件数目,设置为5表示一次请求返回5条日志信息
batch_count => 1
# logstash redis插件工作方式
data_type => "list"
# 监听的键值
key => "logstash-test-list"
# redis地址
host => "127.0.0.1"
# redis端口号
port => 6379
# 如果有安全认证,此项为认证密码
password => "123qwe"
# 如果应用使用了不同的数据库,此为redis数据库的编号,默认为0。
db => 0
# 启用线程数量
threads => 1
}
}
beats插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html
input {
beats {
#指定监听端口
port => 5044
#要监听的ip地址,默认0.0.0.0;
host => '0.0.0.0'
}
}
更多input插件可参考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
filter 模块:
filter模块下主要插件grok、mutate、ruby、date、json如下:
grok插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
filter{
# 解析任意文本并且结构化他们。grok目前是logstash中最好的解析非结构化日志并且结构化他们的工具。这个工具非常适合syslog、apache log、mysql log之类的人们可读日志的解析
grok{
# 正则匹配日志,可以筛选分割出需要记录的字段和值
match => { "message" => "正则表达式"}
# 删除不需要记录的字段
remove_field => ["message"]
}
}
mutate插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html
filter {
#mutate过滤器允许您对字段执行常规突变。您可以重命名,删除,替换和修改事件中的字段。
mutate {
#将字段的值转换为其他类型,例如将字符串转换为整数。如果字段值是数组,则将转换所有成员。如果该字段是哈希,则不会采取任何操作。
convert => [
#把request_time的值装换为浮点型
"request_time", "float",
#costTime的值转换为整型
"costTime", "integer"
]
#将现有字段复制到另一个字段。将覆盖现有目标字段
copy => { "source_field" => "dest_field" }
#将正则表达式与字段值匹配,并将所有匹配替换为替换字符串。仅支持字符串或字符串数组的字段。对于其他类型的领域,将不采取任何行动。
gsub => [
#用下划线替换所有正斜杠
"fieldname", "/", "_",
#替换反斜杠,问号,哈希和减少
#带点“。”
"fieldname2", "[\\?#-]", "."
]
}
ruby插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html
filter {
#ruby插件可以使用任何的ruby语法,无论是逻辑判断,条件语句,循环语句,还是对字符串的操作,对EVENT对象的操作,都是极其得心应手的。
ruby {
#ruby插件有两个属性,一个init 还有一个code
#init属性是用来初始化字段的,你可以在这里初始化一个字段,无论是什么类型的都可以,这个字段只是在ruby{}作用域里面生效。
#这里我初始化了一个名为field的hash字段。可以在下面的coed属性里面使用。
init => [field={}]
#code属性使用两个冒号进行标识,你的所有ruby语法都可以在里面进行。
#下面我对一段数据进行处理。
#首先,我需要在把message字段里面的值拿到,并且对值进行分割按照“|”。这样分割出来的是一个数组(ruby的字符创处理)。
#第二步,我需要循环数组判断其值是否是我需要的数据(ruby条件语法、循环结构)
#第三步,我需要吧我需要的字段添加进入EVEVT对象。
#第四步,选取一个值,进行MD5加密
#什么是event对象?event就是Logstash对象,你可以在ruby插件的code属性里面操作他,可以添加属性字段,可以删除,可以修改,同样可以进行树脂运算。
#进行MD5加密的时候,需要引入对应的包。
#最后把冗余的message字段去除。
code => "
array=event。get('message').split('|')
array.each do |value|
if value.include? 'MD5_VALUE'
then
require 'digest/md5'
md5=Digest::MD5.hexdigest(value)
event.set('md5',md5)
end
if value.include? 'DEFAULT_VALUE'
then
event.set('value',value)
end
end
remove_field=>"message"
"
}
}
json插件配置详解:如下,可酌情选择进行配置,可参考https://www.elastic.co/guide/en/logstash/current/plugins-filters-json.html
filter {
#这是一个JSON解析过滤器。它需要一个包含JSON的现有字段,并将其扩展为Logstash事件中的实际数据结构。
#默认情况下,它会将解析后的JSON放在Logstash事件的根(顶层)中,但是可以使用配置将此过滤器配置为将JSON放入任意任意事件字段中 target。
json {
#指定json所在位置如果您在message字段中有JSON数据
source => "message"
#如果此过滤器成功,请向此事件添加任意字段。字段名称可以是动态的,并使用包含事件的部分内容%{field}。
add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
#移除字段
remove_field => [ "foo_%{somefield}" ]
}
}
更多可参考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
output模块:
output模块下主要插件elasticsearch 、file、redis、email、tdout 等如下:
elasticsearch插件配置详解:如下,可参考https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
output {
#可以同时输出到多个终端
#筛选过滤后的内容输出到终端显示
tdout { codec => "rubydebug" }
#导出到elasticsearch
elasticsearch {
# 导出格式为json
codec => "json"
# ES地址+端口
hosts => ["127.0.0.1:9200"]
# 设置索引,可以使用时间变量
index => "logstash-slow-%{+YYYY.MM.dd}"
# ES如果有安全认证就使用账号密码验证,无安全认证就不需要
user => "admin"
password => "xxxxxx"
}
}
其他可参考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
logstash常用命令如下:
-e :指定logstash的配置信息,可以用于快速测试;
-f :指定logstash的配置文件;可以用于生产环境;
-l :指定日志路径,否则输出到标准输出
通常想执行logtash命令需先到根路径下:
# cd /usr/share/logstash/
再使用/bin/logstash执行命令,如:
# bin/logstash -f logstash.conf
为了更好的的执行logstash命令,创建一个软连接,每次执行命令的时候不用在写安装路劲(默认安装在/usr/share下):
# ln -s /usr/share/logstash/bin/logstash /bin/
logstash -e示例如下:
通过-e参数指定logstash的配置信息,用于快速测试,直接输出到屏幕。--quiet:日志输出安静模式
$ logstash -e "input {stdin{}} output {stdout{}}" --quiet
# 指定输出编码为rubydebug
$ logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
logstash -f示例如下:
首先创建日志解析文件到/etc/logstash/conf.d/下如:
# vi /etc/logstash/conf.d/logstash-simple.conf
从头开始读取/var/log/httpd/access_log,输出到elasticsearch 且指定索引:
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "access-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
后台启动并指定日志文件:
# nohup ./logstash -f ../conf/logstach.conf -l ../log/logstash.log &
启动后结合上篇的Elasticsearch在head插件中查看导入日志:
点击数据浏览查看日志: