安装logstach
https://www.elastic.co/downloads/logstash
直接下载后解压即可,注意选好版本号!! 虽然logstach是可以独立运行,但一般是和 es对应的,所以版本需要选择和es一样的,免得后面出现奇怪的问题!
不需要配环境变量什么的.
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.10.tar.gz
tar -xzvf logstash-5.6.10.tar.gz
查看文档
https://www.elastic.co/guide/en/logstash/5.6/logstash-5-6-10.html#logstash-5-6-10
一些配置
解压后进入 conf目录,有如下文件
jvm.options
log4j2.properties
logstash.yml
startup.options
文件名已经说明了大体功能 。
这些配置在测试阶段默认就行,
logstash.yml 的配置,可参考 https://www.elastic.co/guide/en/logstash/5.6/logstash-settings-file.html
启动说明
软件的启动需要一个 (输入,filter和输出)的conf( 注意,这个conf和上面的不一样,这个是配置是具体业务的)
如官网中的说法:
# This is a comment. You should use comments to describe
# parts of your configuration.
input {
...
}
filter {
...
}
output {
...
}
但是!!! 也可以不要这个conf,直接用命令行加上选项,把配置加上,下面会有这样的例子
第一个直接的例子
直接启动:
bin/logstash -e 'input { stdin { } } output { stdout {} }'
输入和输出都是控制台,输入和输出如下:
aaaaaaaaaaaaaaaa
{
"@version" => "1",
"host" => "onlinegame.i.nease.net",
"@timestamp" => 2018-08-27T03:17:32.704Z,
"message" => "aaaaaaaaaaaaaaaa"
}
bbbbbbbbbbbbbbb
{
"@version" => "1",
"host" => "onlinegame.i.nease.net",
"@timestamp" => 2018-08-27T03:17:40.610Z,
"message" => "bbbbbbbbbbbbbbb"
}
例子,加上基本的配置文件,输入还是控制台
一个官网的例子
input { stdin { } }
filter {
mutate { add_field => { "show" => "This data will be in the output" } }
mutate { add_field => { "[@metadata][test]" => "Hello" } }
mutate { add_field => { "[@metadata][no_show]" => "This data will not be in the output" } }
}
output {
if [@metadata][test] == "Hello" {
stdout { codec => rubydebug }
}
}
采用官网的例子,如下,输入和输出都是控制台,不过加了一些filter
启动:
bin/logstash -f /home/comp/logconf/console_console.conf
控制台输出:
gogogogogoog
{
"@version" => "1",
"host" => "onlinegame.i.nease.net",
"show" => "This data will be in the output",
"@timestamp" => 2018-08-27T03:25:43.309Z,
"message" => "gogogogogoog"
}
上面的 @metadata 是一个内置自定义字段,里面的内容不会输出,这个字段对一些 判断条件非常有用 。
例子,输出到文件
一个官网的例子
input { stdin { } }
filter {
mutate { add_field => { "show" => "This data will be in the output" } }
mutate { add_field => { "[@metadata][test]" => "Hello" } }
mutate { add_field => { "[@metadata][no_show]" => "This data will not be in the output" } }
}
output {
file {
path => "/home/comp/logs/logstach_output/%{+yyyy.MM.dd.HH}.log"
}
}
启动logstach
bin/logstash -f /home/comp/logconf/console_file.log
如上,输出一个文件,文件名是(时间.log)
例子,从tcp开出的端口输出到es中
一个官网的例子
input {
tcp {
port => 8002
type => syslog
}
udp {
port => 8002
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: % {GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch {
hosts => ["10.88.88.88:9200"]
index => "logstach_a"
}
}
启动logstach
bin/logstash -f /home/comp/logconf/tcp_es.log
logstach 监听 8002 端口,输出 到 es中,index为logstach_a
我们使用 telnet 127.0.0.1 8002 ,然后里面输入以下内容:
Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
关于 filter,我们可以看到filter中有 grok,这是 用于 把非结构化但有规则的数据处理成 结构化内容, 上面的意思是 message 的内容会被解析成相应的字段.
如果 不符合相应的格式,也不会抛错,只是会不去filter处理.
例子,输入json输出到按日志分的 es中,
input {
tcp {
port => 8002
type => syslog
}
udp {
port => 8002
type => syslog
}
}
filter {
json{source=> "message"}
}
output {
elasticsearch {
document_type => "cod"
hosts => ["10.88.88.88:9200"]
index => "logstach_json"
}
}
在telnet 中输入
{"name":"ddddd","age":121}
es中的结果:
{
"_index": "logstach_json",
"_type": "cod",
"_id": "AWV6Ja_ARuskeT_Rckb6",
"_score": 1,
"_source": {
"@timestamp": "2018-08-27T06:50:14.809Z",
"port": 32925,
"@version": "1",
"host": "127.0.0.1",
"name": "ddddd",
"message": """{"name":"ddddd","age":121}
""",
"type": "syslog",
"age": 121
}
},
关于 es中的type 是怎么定的? 如果 我们不定义 document_type,数据也是能扔到es的,不过其type会变成数据中的type,如上面的例子中,type是syslog
设定一个json例子,里面有日期,根据日期不同放到不同的表中
说明
使用上,我们会更关注logstash 中的 各种 plugins, 在input,output,filter,在官网可以找到非常丰富的资料
参考:
https://www.imooc.com/video/16134
https://www.elastic.co/guide/en/logstash/5.6/index.html