1、安装
建议直接从ela官网安装
安装链接
这里我用的是yum安装
下载并安装公共密钥:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
例如,将以下内容添加到/etc/yum.repos.d/目录中的带.repo后缀的文件中logstash.repo
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装
sudo yum install logstash
2、使用简单的logstash示例
进入logstash容器,默认是logstash用户,如何进入root用户?
exec进入容器并切换用户的命令
docker exec -it --user root logstash bash
在终端中,像下面这样运行命令来启动 Logstash 进程:
# logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
结果
{
"message" => "Hello World",
"@version" => "1",
"@timestamp" => "2014-08-07T10:30:59.937Z",
"host" => "raochenlindeMacBook-Air.local",
}
- message: 存储的真实信息
- timestamp 时间戳 代表事件发生的时间
- host: 标记事件发生在哪里
解释
Logstash 就像管道符一样!
你输入(就像命令行的 cat )数据,然后处理过滤(就像 awk 或者 uniq 之类)数据,最后输出(就像 tee )到其他地方。
当然实际上,Logstash 是用不同的线程来实现这些的。如果你运行 top 命令然后按下 H 键,你就可以看到下面这样的输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21401 root 16 0 1249m 303m 10m S 18.6 0.2 866:25.46 |worker
21467 root 15 0 1249m 303m 10m S 3.7 0.2 129:25.59 >elasticsearch.
21468 root 15 0 1249m 303m 10m S 3.7 0.2 128:53.39 >elasticsearch.
21400 root 15 0 1249m 303m 10m S 2.7 0.2 108:35.80 <file
21403 root 15 0 1249m 303m 10m S 1.3 0.2 49:31.89 >output
21470 root 15 0 1249m 303m 10m S 1.0 0.2 56:24.24 >elasticsearch.
小贴士:logstash 很温馨的给每个线程都取了名字,输入的叫xx,过滤的叫|xx
数据在线程之间以 事件 的形式流传。不要叫行,因为 logstash 可以处理多行事件
。
小贴士:每个 logstash 过滤插件,都会有四个方法叫 add_tag
, remove_tag
, add_field
和 remove_field
。它们在插件过滤匹配成功时生效。
remove_field
是使用频次最多的
logstash长期运行
完成上一节的初次运行后,你肯定会发现一点:一旦你按下 Ctrl+C,停下标准输入输出,logstash 进程也就随之停止了。作为一个肯定要长期运行的程序,应该怎么处理呢?
这里介绍的是以守护进程方式运行
对于需要长期后台运行的大量程序(注意大量,如果就一个进程,还是学习一下怎么写 init 脚本吧),推荐大家使用一款 daemontools 工具。
daemontools 是一个软件名称,不过配置略复杂。所以这里我其实是用其名称来指代整个同类产品,包括但不限于 python 实现的 supervisord,perl 实现的 ubic,ruby 实现的 god 等。
安装
yum -y install python-setuptools
easy_install supervisor
supervisord -v # 默认安装最新版本
生成默认的配置文件
echo_supervisord_conf > /etc/supervisord.conf
继续编写配置文件
[program:elkpro_1]
environment=LS_HEAP_SIZE=5000m
#directory=/usr/share/logstash/bin/logstash
command=logstash -f /usr/share/logstash/pipeline/logstash.conf
# 这是要启动的程序
启动程序
supervisord -c /etc/supervisord.conf
查看程序启动的情况
supervisorctl
logstash 会以 supervisord 子进程的身份运行,你还可以使用 supervisorctl 命令,单独控制一系列 logstash 子进程中某一个进程的启停操作:
supervisorctl stop elkpro_1
logstash的配置语法
区段
Logstash 用 {} 来定义区域。区域内可以包括插件区域定义,你可以在一个区域内定义多个插件。插件区域内则可以定义键值对设置。示例如下:
input {
stdin {}
syslog {}
}
数据类型
Logstash 支持少量的数据值类型:
- bool
debug => true
- string
host => "hostname"
- number
port => 514
- array
match => ["datetime", "UNIX", "ISO8601"]
- hash
options => {
key1 => "value1",
key2 => "value2"
}
注意:如果你用的版本低于 1.2.0,哈希的语法跟数组是一样的,像下面这样写:
match => [ "field1", "pattern1", "field2", "pattern2" ]
字段引用
字段是 Logstash::Event 对象的属性。我们之前提过事件就像一个哈希一样,所以你可以想象字段就像一个键值对。
小贴士:我们叫它字段,因为 Elasticsearch 里是这么叫的。
如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。
对于 嵌套字段(也就是多维哈希表,或者叫哈希的哈希),每层的字段名都写在 [] 里就可以了。比如,你可以从 geoip 里这样获取 longitude 值(是的,这是个笨办法,实际上有单独的字段专门存这个数据的):
[geoip][location][0]
条件判断(condition)
表达式支持下面这些操作符:
- equality, etc: ==, !=, <, >, <=, >=
- regexp: =~, !~
- inclusion: in, not in
- boolean: and, or, nand, xor
- unary: !()
通常来说,你都会在表达式里用到字段引用。比如:
if "_grokparsefailure" not in [tags] {
} else if [status] !~ /^2\d\d/ and [url] == "/noc.gif" {
} else {
}
命令行参数
- -e
意即执行。我们在 "Hello World" 的时候已经用过这个参数了。事实上你可以不写任何具体配置,直接运行 bin/logstash -e '' 达到相同效果。这个参数的默认值是下面这样:
input {
stdin { }
}
output {
stdout { }
}
-
--config 或 -f
意即文件。真实运用中,我们会写很长的配置,甚至可能超过 shell 所能支持的 1024 个字符长度。所以我们必把配置固化到文件里,然后通过 bin/logstash -f agent.conf 这样的形式来运行。 -
--configtest 或 -t
意即测试。用来测试 Logstash 读取到的配置文件语法是否能正常解析 -
--log 或 -l
意即日志。Logstash 默认输出日志到标准错误。生产环境下你可以通过 bin/logstash -l logs/logstash.log 命令来统一存储日志。 -
--filterworkers 或 -w
意即工作线程。Logstash 会运行多个线程。你可以用 bin/logstash -w 5 这样的方式强制 Logstash 为过滤插件运行 5 个线程。
网友评论