CentOS 7,Logstash6.3.2html
Logstash:Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它能够从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它可以以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。node
本篇文章主要讲述Logstash的安装及相关配置mysql
为了保持与Elasticsearch的版本一致,咱们也选择版本6.3.2;咱们能够从https://www.elastic.co/downloads选择要下载的版本连接:nginx
# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.2.rpm # rpm -hvi logstash-6.3.2.rpm
安装完成以后咱们能够看到配置的路径为/etc/logstash;安装路径为/usr/share/logstash/;web
首先咱们进入到安装路径下能够看到相关配置文件:正则表达式
# cd /etc/logstash/ # ls conf.d jvm.options log4j2.properties logstash.yml pipelines.yml startup.options
通常测试时须要配置内存,默认内存为1g;redis
Logstash 经过管道进行运做,管道有两个必需的元素,输入和输出,还有一个可选的元素,过滤器。sql
输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。以下图:数据库
这中间的配置都是经过日志解析文件来进行配置,日志解析配置文件的框架共分为三个模块:input,output,filter;apache
配置文件通常放在/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插件中查看导入日志:
点击数据浏览查看日志: