ELK+FileBeat进行日志采集安装部署文档


ELK+FileBeat部署


1、需要的软件:https://www.elastic.co/downloads
ELK+FileBeat进行日志采集安装部署文档_第1张图片
2、FileBeat安装部署
2.1、安装
解压filebeat-6.2.3-linux-x86_64.tar.gz
tar -zxf filebeat-6.2.3-linux-x86_64.tar.gz
2.2、配置
2.2.1、Filebeat Prospector
filebeat.prospectors:

  • input_type: log
    paths:
    - /var/log/apache/httpd-*.log
    document_type: apache

  • input_type: log
    paths:
    - /var/log/messages
    - /var/log/*.log

2.2.2、Filebeat Options
input_type: log|stdin
指定输入类型
paths
支持基本的正则,所有golang glob都支持,支持/var/log//.log
encoding
plain, latin1, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, hz-gb-2312,
euc-kr, euc-jp, iso-2022-jp, shift-jis, and so on
exclude_lines
支持正则 排除匹配的行,如果有多行,合并成一个单一行来进行过滤
include_lines
支持正则 include_lines执行完毕之后会执行exclude_lines。
exclude_files
支持正则 排除匹配的文件
exclude_files: [’.gz$’]
tags
列表中添加标签,用过过滤
 filebeat.prospectors:
 - paths: ["/var/log/app/.json"]
 tags: [“json”]
fields
可选字段,选择额外的字段进行输出
可以是标量值,元组,字典等嵌套类型
默认在sub-dictionary 位置
 filebeat.prospectors:
 - paths: ["/var/log/app/
.log"]
 fields:
 app_id: query_engine_12
fields_under_root
如果值为ture,那么fields存储在输出文档的顶级位置
如果与filebeat中字段冲突,自定义字段会覆盖其他字段
fields_under_root: true
fields:
 instance_id: i-10a64379
 region: us-east-1
ignore_older
可以指定Filebeat忽略指定时间段以外修改的日志内容
文件被忽略之前,确保文件不在被读取,必须设置ignore older时间范围大于close_inactive
如果一个文件正在读取时候被设置忽略,它会取得到close_inactive后关闭文件,然后文件被忽略
close_*
close_ *配置选项用于在特定标准或时间之后关闭harvester。 关闭harvester意味着关闭文件处理程序。 如果在harvester关闭后文件被更新,则在scan_frequency过后,文件将被重新拾取。 但是,如果在harvester关闭时移动或删除文件,Filebeat将无法再次接收文件,并且harvester未读取的任何数据都将丢失。
close_inactive
启动选项时,如果在制定时间没有被读取,将关闭文件句柄
读取的最后一条日志定义为下一次读取的起始点,而不是基于文件的修改时间
如果关闭的文件发生变化,一个新的harverster将在scan_frequency运行后被启动
建议至少设置一个大于读取日志频率的值,配置多个prospector来实现针对不同更新速度的日志文件
使用内部时间戳机制,来反映记录日志的读取,每次读取到最后一行日志时开始倒计时
使用2h 5m 来表示
close_rename
当选项启动,如果文件被重命名和移动,filebeat关闭文件的处理读取
close_removed
当选项启动,文件被删除时,filebeat关闭文件的处理读取
这个选项启动后,必须启动clean_removed
close_eof
适合只写一次日志的文件,然后filebeat关闭文件的处理读取
close_timeout
当选项启动时,filebeat会给每个harvester设置预定义时间,不管这个文件是否被读取,达到设定时间后,将被关闭
close_timeout 不能等于ignore_older,会导致文件更新时,不会被读取
如果output一直没有输出日志事件,这个timeout是不会被启动的,至少要要有一个事件发送,然后haverter将被关闭
设置0 表示不启动
clean_inactived
从注册表文件中删除先前收获的文件的状态
设置必须大于ignore_older+scan_frequency,以确保在文件仍在收集时没有删除任何状态
配置选项有助于减小注册表文件的大小,特别是如果每天都生成大量的新文件
此配置选项也可用于防止在Linux上重用inode的Filebeat问题
clean_removed
启动选项后,如果文件在磁盘上找不到,将从注册表中清除filebeat
如果关闭close removed 必须关闭clean removed
scan_frequency
prospector检查指定用于收获的路径中的新文件的频率,默认10s
document_type
类型事件,被用于设置输出文档的type字段,默认是log
harvester_buffer_size
每次harvester读取文件缓冲字节数,默认是16384
max_bytes
对于多行日志信息,很有用,最大字节数
json
这些选项使Filebeat解码日志结构化为JSON消息
逐行进行解码json
keys_under_root
o设置key为输出文档的顶级目录
overwrite_keys
o覆盖其他字段
add_error_key
o定一个json_error
message_key
o指定json 关键建作为过滤和多行设置,与之关联的值必须是string
multiline
控制filebeat如何处理跨多行日志的选项,多行日志通常发生在java堆栈中
multiline.pattern: ‘^[’
multiline.negate: true
multiline.match: after
上面匹配是将多行日志所有不是以[符号开头的行合并成一行它可以将下面的多行日志进行合并成一行

multiline.pattern
指定匹配的正则表达式,filebeat支持的regexp模式与logstash支持的模式有所不同
pattern regexp
multiline.negate
定义上面的模式匹配条件的动作是 否定的,默认是false
假如模式匹配条件’^b’,默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并
如果是true,表示将不以b开头的日志行进行合并
multiline.match
指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negate
multiline.max_lines
可以组合成一个事件的最大行数,超过将丢弃,默认500
multiline.timeout
定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5s
tail_files
如果此选项设置为true,Filebeat将在每个文件的末尾开始读取新文件,而不是开头
此选项适用于Filebeat尚未处理的文件
symlinks
符号链接选项允许Filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使报告了符号链接的路径,Filebeat也会打开并读取原始文件。
backoff
backoff选项指定Filebeat如何积极地抓取新文件进行更新。默认1s
backoff选项定义Filebeat在达到EOF之后再次检查文件之间等待的时间。
max_backoff
在达到EOF之后再次检查文件之前Filebeat等待的最长时间
backoff_factor
指定backoff尝试等待时间几次,默认是2
harvester_limit
harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数
enabled
控制prospector的启动和关闭
2.2.3、filebeat global
spool_size
事件发送的阀值,超过阀值,强制刷新网络连接
filebeat.spool_size: 2048
publish_async
异步发送事件,实验性功能
idle_timeout
事件发送的超时时间,即使没有超过阀值,也会强制刷新网络连接
filebeat.idle_timeout: 5s
registry_file
注册表文件的名称,如果使用相对路径,则被认为是相对于数据路径
有关详细信息,请参阅目录布局部分 默认值为${path.data}/registry
 filebeat.registry_file: registry
config_dir
包含额外的prospector配置文件的目录的完整路径
每个配置文件必须以.yml结尾
每个配置文件也必须指定完整的Filebeat配置层次结构,即使只处理文件的prospector部分。
所有全局选项(如spool_size)将被忽略
必须是绝对路径
filebeat.config_dir: path/to/configs
shutdown_timeout
Filebeat等待发布者在Filebeat关闭之前完成发送事件的时间。
2.2.4、Filebeat General
name
设置名字,如果配置为空,则用该服务器的主机名
name: “my-shipper”
queue_size
单个事件内部队列的长度 默认1000
bulk_queue_size
批量事件内部队列的长度
max_procs
设置最大使用cpu数量
geoip.paths
此配置选项目前仅由Packetbeat使用,它将在6.0版中删除
要使GeoIP支持功能正常,GeoLite City数据库是必需的。
geoip:
 paths:
 - “/usr/share/GeoIP/GeoLiteCity.dat”
 - “/usr/local/var/GeoIP/GeoLiteCity.dat”
2.2.5、Filebeat reload
属于测试功能
path
定义要检查的配置路径
reload.enabled
设置为true时,启用动态配置重新加载。
reload.period
定义要检查的间隔时间
filebeat.config.prospectors:
path: configs/*.yml
reload.enabled: true
reload.period: 10s
2.3、启动
nohup ./ filebeat &
关闭ps -ef|grep filebeat找到进程kill
3、LogStash安装部署
3.1、安装
解压logstash-6.2.3.tar.gz
tar -zxf logstash-6.2.3.tar.gz
3.2、配置
Logstash工作的三个阶段:
input数据输入端,可以接收来自任何地方的源数据。

  • file:从文件中读取
  • syslog:监听在514端口的系统日志信息,并解析成RFC3164格式。
  • redis:从redis-server list中获取
  • beat:接收来自Filebeat的事件
    Filter数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加,修改等,常用的过滤器如下。
  • grok:通过正则解析和结构化任何文本。Grok目前是logstash最好的方式对非结构化日志数据解析成结构化和可查询化。logstash内置了120个匹配模式,满足大部分需求。
  • mutate:在事件字段执行一般的转换。可以重命名、删除、替换和修改事件字段。
  • drop:完全丢弃事件,如debug事件。
  • clone:复制事件,可能添加或者删除字段。
  • geoip:添加有关IP地址地理位置信息。
    output是logstash工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:
  • elasticsearch:发送事件数据到Elasticsearch,便于查询,分析,绘图。
  • file:将事件数据写入到磁盘文件上。
  • mongodb:将事件数据发送至高性能NoSQL mongodb,便于永久存储,查询,分析,大数据分片。
  • redis:将数据发送至redis-server,常用于中间层暂时缓存。
  • graphite:发送事件数据到graphite。http://graphite.wikidot.com/
  • statsd:发送事件数据到statsd。

在config下为logstash新建一个配置文件config/***_logstash.conf:
3.2.1、输入
从filebeat中获取信息
beats {
type => “crm_log”
port => 5044
}

3.2.2、过滤
grok
目前是logstash中把非标准化的日志数据转换成标准化并且可搜索数据最好的方式。Logstash默认提供了能分析包括java堆栈日志、apache日志在内的120种形式。点击查看
如没有特别的需求的话,使用默认的apache日志形式就能达到想要的效果,如下。
grok{
match => {“message” => ["%{COMBINEDAPACHELOG}"]}
}

但如果想要监控更多的信息,比如url上的参数,那么默认的表达式将没办法满足我们的需求,这时我们就需要自己动手去编写一些符合我们业务需要的表达式,并告诉logstash以某种期望的方式进行数据转换。
首先,在logstash的根目录下创建一个patterns文件夹,这个文件夹默认是没有的。
其次,在patterns文件夹中创建文件test_pattern(这里为了方便所以没有按照pattern的功能对文件进行命名,在实际应用中最好按照功能来对文件命名,至于原因你懂的)。在test_pattern文件中可以按照“名称 正则表达式”这样的格式自定义一些正则表达式,以便在grok中进行使用。
最后,在使用的时候一定要把pattern_dir这个参数带上,否则logstash无法识别你自定义的这些正则表达式。
grok {
patterns_dir => ["/home/keepgostudio/download/logstash-5.2.0/patterns"]
match => {
“message” => ["%{PARAMS_APACHELOG}", “%{NO_PARAMS_APACHELOG}”]
}
remove_field => [“host”, “timestamp”, “httpversion”, “@version”]
}

· 第一种,直接使用oniguruma语法去匹配文本片段,语法如下
(?the pattern here)
· 假设你需要匹配的文本片段为一个长度为10或11的十六进制的值,使用下列语法可以获取该片段,并把值赋予queue_id
(?[0-9A-F]{10,11})
· · 第二种,创建自定义pattern文件
创建文件夹patterns,在此文件夹下面创建一个文件,文件名随意,eg: postfix

contents of ./patterns/postfix:

POSTFIX_QUEUEID [0-9A-F]{10,11}
然后将patterns file引入,告诉logstash你的自定义类型文件,以下面的event log record为例子:
55.3.244.1 GET /index.html 15824 0.043 ABC24C98567
在logstash conf.d文件夹下面创建filter conf文件,内容如下
filter {
grok {
patterns_dir => ["./patterns"]
match => { “message” => “%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time} %{POSTFIX_QUEUEID:queue_id}” }
}
}
mutate
mutate插件是用来处理数据的格式的,你可以选择处理你的时间格式,或者你想把一个字符串变为数字类型(当然需要合法),同样的你也可以返回去做。可以设置的转换类型 包括: “integer”, “float” 和 “string”。

mutate { #接收一个数组,其形式为value,type #需要注意的是,你的数据在转型的时候要合法,你总是不能把一个‘abc’的字符串转换为123的。 convert => [ #把request_time的值装换为浮点型 “request_time”, “float”, #costTime的值转换为整型 “costTime”, “integer” ] }
filter {
mutate {
#接收一个数组,其形式为value,type
#需要注意的是,你的数据在转型的时候要合法,你总是不能把一个‘abc’的字符串转换为123的。
convert => [
#把request_time的值装换为浮点型
“request_time”, “float”,
#costTime的值转换为整型
“costTime”, “integer”
]
}
}
kv
将数据源转换成键值对,并创建相对的field。比如传入“a=111&b=2222&c=3333”,输出的时候,a,b,c会被创建成三个field,这样做的好处是,当需要查询某一个参数的时候可直接查询,而不是把一个字符串搜索出来再做解析。
kv {
source => “field_name”
field_split => “&?”
}
geoip
这个从字面上就能看出他的功能,根据ip查出相应的地理信息,比如城市,省份,国家,经纬度等。这个ip信息是在logstash中的一个数据源中进行搜索查找,而不是进行网络搜索。
geoip {
source => “field_name”
fields => [“country_name”, “region_name”, “city_name”, “latitude”, “longitude”]
target => “location”
}
drop
drop可以跳过某些不想统计的日志信息,当某条日志信息符合if规则时,该条信息则不会在out中出现,logstash将直接进行下一条日志的解析。
if [field_name] == “value” {
drop {}
}
Ruby
官方对ruby插件的介绍是——无所不能。ruby插件可以使用任何的ruby语法,无论是逻辑判断,条件语句,循环语句,还是对字符串的操作,对EVENT对象的操作,都是极其得心应手的。

filter {
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”
"
}
}
Date
这里需要合前面的grok插件剥离出来的值logdate配合使用(当然也许你不是用grok去做)。
filter{
date{
#还记得grok插件剥离出来的字段logdate吗?就是在这里使用的。你可以格式化为你需要的样子,至于是什么样子。就得你自己取看啦。
#为什什么要格式化?
#对于老数据来说这非常重要,应为你需要修改@timestamp字段的值,如果你不修改,你保存进ES的时间就是系统但前时间(+0时区)
#单你格式化以后,就可以通过target属性来指定到@timestamp,这样你的数据的时间就会是准确的,这对以你以后图表的建设来说万分重要。
#最后,logdate这个字段,已经没有任何价值了,所以我们顺手可以吧这个字段从event对象中移除。
match=>[“logdate”,“dd/MMM/yyyy:HH:mm:ss Z”]
target=>"@timestamp"
remove_field => ‘logdate’
#还需要强调的是,@timestamp字段的值,你是不可以随便修改的,最好就按照你数据的某一个时间点来使用,
#如果是日志,就使用grok把时间抠出来,如果是数据库,就指定一个字段的值来格式化,比如说:“timeat”, “%{TIMESTAMP_ISO8601:logdate}”
#timeat就是我的数据库的一个关于时间的字段。
#如果没有这个字段的话,千万不要试着去修改它。

}

}
json
这个插件也是极其好用的一个插件,现在我们的日志信息,基本都是由固定的样式组成的,我们可以使用json插件对其进行解析,并且得到每个字段对应的值。
filter{
#source指定你的哪个值是json数据。
json {
source => “value”
}
#注意:如果你的json数据是多层的,那么解析出来的数据在多层结里是一个数组,你可以使用ruby语法对他进行操作,最终把所有数据都装换为平级的。

}
json插件还是需要注意一下使用的方法的,下图就是多层结构的弊端:

对应的解决方案为:
ruby{
code=>"
kv=event.get(‘content’)[0]
kv.each do |k,v|
event.set(k,v)
end"
remove_field => [‘content’,‘value’,‘receiptNo’,‘channelId’,‘status’]
}
3.2.3、输出
logstash输出到elasticsearch时,会随机生成一个id给每一条记录。建议在刚开始接触的时候,可以采用手动输入的方式。这样结合elasticsearch的服务,更容易理解整个实现的流程。
elasticsearch {
hosts => [":9200"]
index => “logstash-test-%{type}-%{host}”
}
3.2.4、示例
test.config
input {
beats {
type => “ods”
port => 5044
}
}
filter{
ruby{
code => “event.set(‘create_time’, (event.get(’@timestamp’).time.localtime.strftime(’%Y-%m-%d %H:%M:%S’)))”
}

    remove_field => ["@version","fields","beat","tags" ]
}
mutate {
   convert => [
      "channelId", "integer",
      "cost","integer",
      "oprPosCode","integer"
   ]
}
date {
  match => [ "rec_time", "yyyy-MM-dd HH:mm:ss","MM-dd HH:mm:ss" ]
  target => "@timestamp"
}
ruby {   
   code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"   
}  
ruby {  
   code => "event.set('@timestamp',event.get('timestamp'))"  
}
date {
  match => [ "create_time", "yyyy-MM-dd HH:mm:ss"]
  target => "create_time"
}
ruby {
   code => "event.set('@create_time', event.get('create_time').time.localtime + 8*60*60)"
}
ruby {
   code => "event.set('create_time',event.get('@create_time'))"
}  
mutate {  
  remove_field => ["timestamp","@create_time"]  
}

}
}
output {
elasticsearch {
hosts => [“http://132.252.145.130:9200”]
index => “log_%{type}-%{+YYYY.MM.dd}”
document_type => “%{type}”
template_overwrite => true
}
stdout{
codec=>rubydebug
}
}
3.2.5、GrokDebuger
Grok正则配置测试,可以访问https://grokdebug.herokuapp.com/直接请求测试,但是此种方式需要。也可以使用模拟工具请求,具体请求格式如下:
请求地址:https://grokdebug.herokuapp.com/grok
请求方法:POST
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
请求参数:
custom_patterns=&input=南京&pattern=(?

[\s\S])&named_captures_only=false&keep_empty_captures=false&singles=false
请求返回:
{
“address”: [
[
“南京”
]
]
}
测试时需要更改input参数和pattern,如果数据复杂需要将input和pattern的值使用urlencoder转换一下
3.3、启动
nohup ./bin/logstash -f config/ ***_logstash.conf &
关闭可以jps -l或者ps -ef|grep logstash找到进程kill
4、elasticsearch安装部署
4.1、安装(单机版)
解压elasticsearch-6.2.3.tar.gz
tar -zxf elasticsearch-6.2.3.tar.gz
4.2、配置
[1]: max number of threads [1024] for user [
**] is too low, increase to at least [4096]
[2]: max virtual memory areas vm.max_map_count
以上两个属于系统配置修改
进入 安装目录,修改conf/ elasticsearch.yml :
path.data: path/data

Path to log files:

path.logs: path/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 132.228.248.19
4.3、启动
./elasticsearch -d (-d:后台启动)
关闭直接kill进程id
4.4、测试验证
执行 curl -X GET http://@.@.@.@:9200
{
“name” : “node-1”,
“cluster_name” : “hyxt_logs_es”,
“cluster_uuid” : “l_31dzUURiWnLUAI60Zm8w”,
“version” : {
“number” : “6.1.2”,
“build_hash” : “5b1fea5”,
“build_date” : “2018-01-10T02:35:59.208Z”,
“build_snapshot” : false,
“lucene_version” : “7.1.0”,
“minimum_wire_compatibility_version” : “5.6.0”,
“minimum_index_compatibility_version” : “5.0.0”
},
“tagline” : “You Know, for Search”
}
4.5、扩展
建立mapping模板(在es 2.*版本里面是没有这两个字段,只有string字段。
5.之后,把string字段设置为了过时字段,引入text,keyword字段
这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的
keyword:存储数据时候,不会分词建立索引
text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。

{
“template-logstash-crm”: {
“template”: "crm_log-
",
“settings”: {
“index.number_of_shards”: 5,
“number_of_replicas”: 1,
“translog.flush_threshold_size”:“1024mb”
},
“mappings”: {
“log”: {
“_source”: {“enabled”: “true”
},
“properties”: {
“type”: {
“type”: “keyword”
},
“busiCode”: {
“type”: “keyword”
},
“host”: {
“type”: “keyword”
},
“hallId”: {
“type”: “keyword”
},
“channelId”: {
“type”: “integer”
},
“oprPosCode”: {
“type”: “integer”
},
“message”: {
“type”: “text”
},
“operId”: {
“type”: “keyword”
},
“source”: {
“type”: “keyword”
},
“cost”: {
“type”: “long”
},
“userCode”: {
“type”: “keyword”
},
“cityId”: {
“type”: “keyword”
},
“@timestamp”: {
“type”: “date”
},
“date”: {
“type”: “date”
}
}
}
}
}
}
新建模板
curl -XPUT ip:9200/_template/my_template -d @xx.json
查看模板
curl -XGET ip:9200/_template/my_template
删除模板
curl -XDELETE ip:9200/_template/my_template

curl -XPUT ip:9200/my_index/_settings -d’{“index.number_of_replicas”: 2}’
5、kibana安装部署
5.1、安装
解压kibana-6.2.3-linux-x86_64.tar.gz
tar -zxf kibana-6.2.3-linux-x86_64.tar.gz
5.2、配置
server.port: 5601
server.host: “192.168.1.228”
elasticsearch.url: “http://192.168.1.228:9200”
pid.file: /var/run/kibana.pid
logging.dest: path/logs/kibana.log
5.3、启动
nohup ./kibana &
关闭ps -ef | grep node找到进程id或者查看配置的pid文件直接kill
5.4、注意事项
时区选择问题,需要在Advanced Settings中设置dateFormat:tz为UTC,因为logstash写时间时增加了8个小时的时区
ELK+FileBeat进行日志采集安装部署文档_第2张图片
ELK+FileBeat进行日志采集安装部署文档_第3张图片
5.5、测试验证
登录访问:http://ip:5601(默认端口为5601)

ELK+FileBeat进行日志采集安装部署文档_第4张图片

ELK+FileBeat进行日志采集安装部署文档_第5张图片
ELK+FileBeat进行日志采集安装部署文档_第6张图片

GET log-2018.04.13/_search
{
“query”: {
“match_all”: {}
}
}
ELK+FileBeat进行日志采集安装部署文档_第7张图片

https://github.com/NLPchina/elasticsearch-sql
132.228.248.19 jsyx anN5eA2017=2
xlj_es Hgef35Bn
/home/xlj_es/logstash-6.2.3/config

6、elasticsearch-sql
6.1、安装
./elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/6.2.3.0/elasticsearch-sql-6.2.3.0.zip
或者下载下来安装
指定协议为file:
Node.js环境安装,配置环境变量
On elasticsearch 1.x / 2.x, visit the elasticsearch-sql web front-end:
http://localhost:9200/_plugin/sql/
On elasticsearch 5.x/6.x,download and extract site.
https://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.1.0/es-sql-site-standalone.zip
Then start the web front-end like this:
cd site-server
npm install express --save
node node-server.js

问题解决方案:
修改ES配置文件/etc/elasticsearch/elasticsearch.yml,增加以下几行:
http.cors.enabled: true
http.cors.allow-credentials: true
http.cors.allow-origin: “/.*/”
http.cors.allow-headers: WWW-Authenticate,X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
1
重启集群
访问elasticsearch-sql的site时,带上用户名、密码、ES的地址作为参数,例如:http://es-sql-site:8080/?username=hello&password=o11eh&base_uri=http://es:9200
为便于大家排障,site的页面会显示错误原因,这里列几个:
未正确配置ES的地址:

Error: “\n\n\n\nError\n\n\n

Cannot POST /_sql
\n\n\n”
elasticsearch.yml中未正确配置http.cors:

Error: Error occured! response is not avalible.
用户名或密码错误:

Error: {“error”:{“root_cause”:[{“type”:“security_exception”,“reason”:“missing authentication token for REST request [/_sql]”,“header”:{“WWW-Authenticate”:"Basic realm=“security” charset=“UTF-8"”}}],“type”:“security_exception”,“reason”:“missing authentication token for REST request [/_sql]”,“header”:{“WWW-Authenticate”:"Basic realm=“security” charset=“UTF-8"”}},“status”:401}

SELECT * FROM log_ods_crm-* where rec_time Between ‘2018-04-17 08:00:00’ and ‘2018-04-17 09:00:00’

如果想要获取es的DSL语句,可以通过elasticsearch-sql获取
ELK+FileBeat进行日志采集安装部署文档_第8张图片

你可能感兴趣的:(elasticsearch专栏)