例子
假设keystore包含一个名为ES_PWD的密钥,其值为yourelasticsearchpassword
在配置文件中使用:
output { elasticsearch {...password => "${ES_PWD}" } } }
在logstash.yaml
中使用
xpack.management.elasticsearch.password: ${ES_PWD}
请注意,Logstash keystore与Elasticsearch keystore不同。Elasticsearch keystore让你按名称存储elasticsearch.yml值,而Logstash keystore让你指定任意的名称,你可以在Logstash配置中引用。
关于如何生成keystore,见:https://www.elastic.co/guide/en/logstash/current/keystore.html
从命令行运行Logstash
要从命令行运行Logstash,使用以下命令:
bin/logstash [options]
其中options
是命令行指令,你可以指定它来控制Logstash的执行。bin
目录的位置因平台而异。参见Logstash目录布局以找到你系统中bin\logstash
的位置。
下面的例子运行Logstash并加载mypipeline.conf
文件中定义的Logstash配置:
bin/logstash -f mypipeline.conf
你在命令行中设置的任何指令都会覆盖logstash.yml中的相应设置,但文件本身不会被改变。它在随后的 Logstash 运行中保持原样。
当你在测试Logstash时,指定命令行选项是很有用的。然而,在生产环境中,我们建议你使用 logstash.yml 来控制 Logstash 的执行。使用设置文件可以让你更容易地指定多个选项,而且它为你提供了一个单一的、版本化的文件,你可以用它来启动Logstash保证每次运行是一致的。
Command-Line Flags
Logstash有以下命令。你可以使用--help
指令来显示这些信息。
--node.name NAME
指定这个Logstash实例的名称。如果没有给出值,它将默认为当前的主机名。
-f, --path.config CONFIG_PATH
从一个特定的文件或目录加载Logstash配置。如果给出了一个目录,该目录中的所有文件将按词汇表顺序串联,然后作为一个单一的配置文件进行解析。不支持多次指定这个指令。如果你多次指定这个指令,Logstash使用最后一次出现的标志(例如,-f foo -f bar
与-f bar
相同)。
你可以指定通配符(globs),任何匹配的文件将按照上述顺序加载。例如,你可以使用通配符功能,按名称加载特定的文件。
bin/logstash --debug -f '/tmp/{one,two,three}'
通过这个命令,Logstash将三个配置文件/tmp/one
、/tmp/two
和/tmp/three
串联起来,并将它们解析为一个单独的配置。
-e, --config.string CONFIG_STRING
使用给定的字符串作为配置数据。与配置文件的语法相同。如果没有指定输入,那么将使用以下内容作为默认输入:input { stdin { type => stdin }
。如果没有指定输出,则使用以下内容作为默认输出:output { stdout { codec => rubydebug }
,如果你希望同时使用这两个默认值,请为-e
标志使用空字符串。默认是nil。--java-execution
为这个选项指定 "false "可以恢复到传统的Ruby执行引擎,而不是默认的Java执行引擎。--plugin-classloaders
(Beta)在独立的类加载器中加载Java插件,以隔离其依赖关系。--modules
启动指定的模块。与-M
选项一起使用,为指定模块的默认变量赋值。如果在命令行中使用--modules
,logstash.yml
中的任何模块都将被忽略,那里的任何设置也是如此。这个标志与-f
和-e
标志是相互排斥的。只能指定-f
、-e
或-modules
中的一个。多个模块可以用逗号隔开,或者多次调用--modules
标志来指定。-M, --modules.variable
为一个模块的可配置选项分配一个值。分配变量的格式是-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.KEY_NAME=value"
对于Logstash变量来说。对于其他设置,它将是-M "MODULE_NAME.KEY_NAME.SUB_KEYNAME=value"
。-M
标志可以根据需要多次使用。如果没有指定-M
选项,那么将使用该设置的默认值。-M
标志只与--modules
标志一起使用。如果没有--modules
标志,它将被忽略。--pipeline.id ID
Sets the ID of pipeline. The default ismain
.-w, --pipeline.workers COUNT
设置要运行的管道工作者的数量。这个选项设置了并行执行管道的过滤和输出阶段的工作者的数量。如果你发现事件正在备份,或者CPU没有饱和,可以考虑增加这个数字,以更好地利用机器的处理能力。默认是主机的CPU核心数。--pipeline.ordered ORDERED
保留事件的顺序。可能的值是 "自动"(默认)、"true "和 "false"。这个设置只有在流水线使用单个工作者时才有效。注意,当启用时,它可能会影响过滤器和输出处理的性能。如果pipeline.workers
设置为1
,auto
选项将自动启用排序。使用true
在管道上启用排序,如果有多个工作者,则防止logstash启动。使用false
来禁用任何为保护排序所需的额外处理。-b, --pipeline.batch.size SIZE
管道工作的批次大小。该选项定义了单个工人线程在试图执行其过滤器和输出之前从输入中收集的最大事件数。默认是125个事件。较大的批处理量通常更有效,但代价是增加内存开销。你可能需要在jvm.options
配置文件中增加JVM的堆空间。参见Logstash配置文件了解更多信息。-u, --pipeline.batch.delay DELAY_IN_MS
当创建管道批处理时,在轮询下一个事件时要等待多长时间。这个选项定义了在轮询下一个事件时要等待多长时间(以毫秒为单位),然后再将一个尺寸不足的批次分配给过滤器和输出。默认是50ms。--pipeline.unsafe_shutdown
强制Logstash在关机时退出,即使内存中仍有机内事件。默认情况下,Logstash会拒绝退出,直到所有收到的事件都被推送到输出端。启用该选项会导致关机期间的数据丢失。--path.data PATH
这应该指向一个可写的目录。当Logstash需要存储数据时,它将使用这个目录。插件也可以访问这个路径。默认是Logstash主页下的data
目录。-p, --path.plugins PATH
找到自定义插件的路径。这个标志可以多次给出以包括多个路径。插件应该在一个特定的目录层次中:PATH/logstash/TYPE/NAME.rb
,其中TYPE
是inputs
、filters
、outputs
或codecs
,而NAME
是插件的名称。-l, --path.logs PATH
写入Logstash内部日志的目录。--log.level LEVEL
设置Logstash的日志级别。可能的值是:fatal
:记录非常严重的错误信息,通常会导致应用程序中止error
:记录错误warn
:记录警告info
:记录详细的信息(这是默认值)debug
:记录调试信息(针对开发者)trace
:记录调试信息之外的更细粒度的信息--config.debug
将完全编译的配置显示为调试日志信息(你还必须启用--log.level=debug
)。警告:日志信息将包括以明文形式传递给插件配置的任何密码选项,并可能导致明文密码出现在你的日志中!-i, --interactive SHELL
下降到shell,而不是正常运行。有效的shell是 "irb "和 "pry"。-V, --version
输出logstash的版本-t, --config.test_and_exit
检查配置的语法是否有效,然后退出。注意,grok模式不会因为这个标志而被检查是否正确。Logstash可以从一个目录中读取多个配置文件。如果你把这个标志和 --log.level=debug结合起来,Logstash将记录合并的配置文件,并在每个配置块上注释它来自的源文件。-r, --config.reload.automatic
监控配置的变化,每当配置发生变化时就重新加载。注意:使用SIGHUP来手动重新加载配置。默认为false。--config.reload.interval RELOAD_INTERVAL
轮询配置位置变化的频率。默认值是 "3s"。注意,单位修饰符(s
)是必需的。--http.host HTTP_HOST
Web API绑定主机。这个选项指定了度量衡REST端点的绑定地址。默认是 "127.0.0.1"。--http.port HTTP_PORT
Web API http端口。这个选项指定了度量衡REST端点的绑定端口。默认是9600-9700。该设置接受格式为9600-9700的范围。Logstash会选取第一个可用的端口。--log.format FORMAT
指定Logstash是以JSON形式(每行一个事件)还是以纯文本形式(使用Ruby的Object#inspect)写入自己的日志。默认是 "纯文本"。--path.settings SETTINGS_DIR
设置包含logstash.yml
[设置文件](https://www.elastic.co/guide/en/logstash/current/logstash-settings-file.html)以及log4j日志配置的目录。这也可以通过LS_SETTINGS_DIR环境变量设置。默认是Logstash首页下的config
目录。--enable-local-plugin-development
这个标志使开发者能够更新他们的本地Gemfile,而不会遇到由冻结的lockfile引起的问题。当你在本地开发/测试插件时,这个标志会很有帮助。
这个标志只适用于Logstash开发者。最终用户不应该需要它。
-h, --help
Print help
在Docker上运行Logstash
在Docker中配置Logstash
docker run --rm -it -v ~/pipeline/:/usr/share/logstash/pipeline/
配置Logstash
配置文件的结构
Logstash配置文件有一个单独的部分,用于您想要添加到事件处理管道中的每一种类型的插件。例如:
# This is a comment. You should use comments to describe # parts of your configuration. input { ... } filter { ... } output { ... }
每个部分包含一个或多个插件的配置选项。如果指定多个筛选器,则按它们在配置文件中的出现顺序应用它们。
插件配置
插件的配置包括插件名和该插件的设置块。例如,这个输入部分配置两个文件输入:
input { file { path => "/var/log/messages" type => "syslog" } file { path => "/var/log/apache/access.log" type => "apache" } }
在本例中,为每个文件输入配置了两个设置:路径和类型。
您可以配置的设置根据插件类型而异。有关每个插件的信息,请参见输入插件、输出插件、过滤插件和编解码器插件。
值类型
插件可以要求设置的值是某种类型,例如 boolean, list, 或者 hash。支持以下值类型。
Array
这个类型现在已经被弃用了,取而代之的是使用标准类型,比如string,插件中定义了:list => true属性,以便更好地进行类型检查。它仍然需要处理不需要类型检查的散列或混合类型列表。
例如:
users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
Lists
不是类型本身的类型,而是属性类型可以有的类型。这使得输入检查多个值成为可能。插件作者可以通过在声明参数时指定:list => true来启用列表检查。
例如:
path => [ "/var/log/messages", "/var/log/*.log" ] uris => [ "http://elastic.co", "http://example.net" ]
这个例子配置path, path是一个字符串,它是一个包含三个字符串每个元素的列表。它还将uri参数配置为uri列表,如果提供的任何uri无效,则失败。
Boolean
布尔值必须为真或假。注意,true和false关键字没有用引号括起来。
例如:
ssl_enable => true
Bytes
字节字段是表示有效字节单位的字符串字段。在插件选项中声明特定大小是一种方便的方法。同时支持SI (k M G T P E Z Y)和二进制(Ki Mi Gi Ti Pi Ei Zi Yi)单元。二进制单位是base-1024,国际单位制单位是base-1000。该字段不区分大小写,并且在值和单位之间接受空格。如果没有指定单位,则整数字符串表示字节数。
例子:
my_bytes => "1113" # 1113 bytes my_bytes => "10MiB" # 10485760 bytes my_bytes => "100kib" # 102400 bytes my_bytes => "180 mb" # 180000000 bytes
Codec
编解码器是用于表示数据的Logstash编解码器的名称。编解码器可用于输入和输出。
输入编解码器提供了一种方便的方法,在数据进入输入之前对其进行解码。输出编解码器提供了一种方便的方法,可以在数据离开输出之前对其进行编码。使用输入或输出编解码器可以避免在Logstash管道中使用单独的过滤器。
可用编解码器的列表可以在编解码器插件页面找到。
例子:
codec => "json"
Hash
哈希是按格式“field1”=>“value1”指定的键值对的集合。请注意,多个键值条目由空格而不是逗号分隔。
例子:
match => { "field1" => "value1" "field2" => "value2" ... } # or as a single line. No commas between entries: match => { "field1" => "value1" "field2" => "value2" }
Number
数字必须是有效的数值(浮点数或整数)。
例子:
port => 33
Password
密码是一个带有单个值的字符串,不会被记录或打印。
例子:
my_password => "password"
URI
例子:
my_uri => "http://foo:bar@example.net"
Path
路径是表示有效操作系统路径的字符串。
例子:
my_path => "/tmp/logstash"
String
字符串必须是单个字符序列。请注意字符串值是用双引号或单引号括起来的。
转义序列
缺省情况下,不启用转义序列。如果您希望在引号字符串中使用转义序列,您需要在logstash.yml中设置config.support_escapes:true。当为true时,带引号的字符串(双引号和单引号)将进行如下转换:
Text | Result |
\r | carriage return (ASCII 13) |
\n | new line (ASCII 10) |
\t | tab (ASCII 9) |
\ | backslash (ASCII 92) |
" | double quote (ASCII 34) |
' | single quote (ASCII 39) |
例子:
name => "Hello world" name => 'It\'s a beautiful day'
Field Reference
Field Reference是一个特殊的String值,表示事件中字段的路径,例如@timestamp或[@timestamp]引用顶级字段,或[client][ip]访问嵌套字段。字段引用深度潜水提供了关于字段引用结构的详细信息。当作为配置选项提供字段引用时,需要用引号括起来,特殊字符必须按照与String相同的规则进行转义。
Comments
注释与perl、ruby和python中的注释相同。注释以#字符开始,不需要位于行首。例如:
# this is a comment input { # comments can appear at the end of a line, too # ... }
访问配置中的事件数据和字段
logstash代理是一个处理管道,有3个阶段:输入→过滤器→输出。输入生成事件,过滤器修改事件,输出将事件发送到其他地方。
所有事件都有属性。例如,一个apache访问日志将包含状态代码(200,404)、请求路径("/","index.html")、HTTP动词(GET, POST)、客户端IP地址等。Logstash将这些属性称为“字段”。
Logstash中的一些配置选项需要存在字段才能运行。因为输入会生成事件,所以在输入块中没有要计算的字段——它们还不存在!
由于它们依赖于事件和字段,下面的配置选项只能在过滤器和输出块中工作。
下面描述的字段引用、sprintf格式和条件式在输入块中不起作用。
Field references
能够通过名称引用字段通常是有用的。为此,可以使用Logstash字段引用语法。
访问字段的基本语法是[fieldname]。如果引用的是顶级字段,可以省略[],只使用字段名。要引用一个嵌套字段,您需要指定该字段的完整路径:[顶级字段] [嵌套字段]。
例如,下面的事件有五个顶级字段(代理、ip、请求、响应、ua)和三个嵌套字段(状态、字节、操作系统)。
{ "agent": "Mozilla/5.0 (compatible; MSIE 9.0)", "ip": "192.168.24.44", "request": "/index.html", "response": { "status": 200, "bytes": 52353 }, "ua": { "os": "Windows 7" } }
要引用os字段,你要指定[ua] [os]。要引用一个顶级字段,如request,你可以简单地指定字段名。
更详细的信息,请参见字段引用深度研究。
sprintf format
字段引用格式也用于Logstash所调用的sprintf格式。这种格式使您能够从其他字符串中引用字段值。例如,statsd输出有一个增量设置,使您能够通过状态代码保持apache日志的计数:
output { statsd { increment => "apache.%{[response][status]}" } }
类似地,您可以将@timestamp字段中的时间戳转换为字符串。不要在花括号中指定字段名,而是使用+FORMAT语法,其中FORMAT是时间格式。
例如,如果您想根据事件的日期、小时和类型字段使用文件输出写入日志:
output { file { path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}" } }
Conditionals
有时你想过滤或只在某些条件下输出一个事件。为此,你可以使用一个条件。
Logstash中的条件式的外观和作用与编程语言中的相同。条件式支持if、else if和else语句,并且可以嵌套。
条件的语法是:
if EXPRESSION { ... } else if EXPRESSION { ... } else { ... }
一个表达式是什么?比较测试、布尔逻辑等等!
你可以使用以下比较操作符:
- equality:
==
,!=
,<
,>
,<=
,>=
- regexp:
=~
,!~
(checks a pattern on the right against a string value on the left) - inclusion:
in
,not in
支持的布尔运算符有:
and
,or
,nand
,xor
支持的一元操作符有:
!
表达式可以很长很复杂。表达式可以包含其他表达式,可以用!来否定表达式,还可以用圆括号(...)来分组。
例如,下面的条件使用mutate
过滤器,如果字段动作的值为login,则删除字段secret。
filter { if [action] == "login" { mutate { remove_field => "secret" } } }
你可以在一个条件中指定多个表达式:
output { # Send production errors to pagerduty if [loglevel] == "ERROR" and [deployment] == "production" { pagerduty { ... } } }
你可以使用in操作符来测试一个字段是否包含一个特定的字符串、键或列表元素。请注意,in的语义可以根据目标类型而变化。例如,当应用于一个字符串时,in的意思是 "是一个子串"。当应用于一个集合类型时,in意味着 "集合包含确切的值"。
filter { if [foo] in [foobar] { mutate { add_tag => "field in field" } } if [foo] in "foo" { mutate { add_tag => "field in string" } } if "hello" in [greeting] { mutate { add_tag => "string in field" } } if [foo] in ["hello", "world", "foo"] { mutate { add_tag => "field in list" } } if [missing] in [alsomissing] { mutate { add_tag => "shouldnotexist" } } if !("foo" in ["hello", "world"]) { mutate { add_tag => "shouldexist" } } }
在条件句中使用not也是一样的。例如,当grok成功时,你可以使用not in只将事件路由到Elasticsearch:
output { if "_grokparsefailure" not in [tags] { elasticsearch { ... } } }
你可以检查一个特定字段的存在,但目前没有办法区分一个不存在的字段和一个简单的假字段。表达式if [foo] 在以下情况下返回false。
[foo]
doesn’t exist in the event,[foo]
exists in the event, but is false, or[foo]
exists in the event, but is null
关于更复杂的例子,请看使用条件语句。
目前不支持条件式中的Sprintf日期/时间格式。有一个使用@metadata字段的变通方法。更多的细节和例子请参见条件式中的sprintf日期/时间格式。
The @metadata field
在Logstash中,有一个叫做@metadata的特殊字段。在输出时,@metadata的内容并不是你的任何事件的一部分,这使得它非常适合用于条件反射,或者用字段引用和sprintf格式化来扩展和构建事件字段。
这个配置文件从STDIN产生事件。无论你输入什么都会成为事件中的消息字段。过滤器块中的mutate
事件增加了一些字段,一些嵌套在@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 { if [@metadata][test] == "Hello" { stdout { codec => rubydebug } } }
让我们看看会有什么结果:
$ bin/logstash -f ../test.conf Pipeline main started asdf { "@timestamp" => 2016-06-30T02:42:51.496Z, "@version" => "1", "host" => "example.com", "show" => "This data will be in the output", "message" => "asdf" }
输入的“asdf”成为消息字段的内容,条件成功地评估嵌套在@metadata字段中的测试字段的内容。但是输出没有显示一个名为@metadata的字段或其内容。
rubydebug编解码器允许你显示@metadata字段的内容,如果你添加一个配置指令,metadata => true:
stdout { codec => rubydebug { metadata => true } }
让我们看看这个变化后的输出是什么样子:
$ bin/logstash -f ../test.conf Pipeline main started asdf { "@timestamp" => 2016-06-30T02:46:48.565Z, "@metadata" => { "test" => "Hello", "no_show" => "This data will not be in the output" }, "@version" => "1", "host" => "example.com", "show" => "This data will be in the output", "message" => "asdf" }
现在您可以看到@metadata字段及其子字段。
只有rubydebug编解码器允许你显示@metadata字段的内容。
当你需要一个临时字段但又不希望它出现在最终输出中时,就可以使用@metadata字段。
也许这个新字段最常见的使用情况之一是与日期过滤器和有一个临时的时间戳。
这个配置文件已被简化,但使用Apache和Nginx网络服务器常用的时间戳格式。在过去,你必须自己删除时间戳字段,在使用它覆盖@timestamp字段后。有了@metadata字段,这就不再需要了。
input { stdin { } } filter { grok { match => [ "message", "%{HTTPDATE:[@metadata][timestamp]}" ] } date { match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { stdout { codec => rubydebug } }
注意,这个配置将提取的日期放入grok过滤器的[@metadata] [timestamp]字段中。让我们给这个配置提供一个样本日期字符串,看看会有什么结果。
$ bin/logstash -f ../test.conf Pipeline main started 02/Mar/2014:15:36:43 +0100 { "@timestamp" => 2014-03-02T14:36:43.000Z, "@version" => "1", "host" => "example.com", "message" => "02/Mar/2014:15:36:43 +0100" }
这就是了! 在输出中没有多余的字段,而且配置文件更简洁,因为你不必在日期过滤器中转换后删除 "时间戳 "字段。
另一个用例是CouchDB变化输入插件。这个插件自动捕捉CouchDB文档字段元数据,并将其放入输入插件本身的@metadata字段中。当事件通过被Elasticsearch索引时,Elasticsearch输出插件允许你指定动作(删除、更新、插入等)和document_id,像这样。
output { elasticsearch { action => "%{[@metadata][action]}" document_id => "%{[@metadata][_id]}" hosts => ["example.com"] index => "index_name" protocol => "http" } }
sprintf data/time formate in conditionals
目前不支持条件中的Sprintf日期/时间格式,但有一个变通方法。把日期计算放在一个字段中,这样你就可以在条件中使用字段引用。
例子:
直接使用sprintf时间格式来添加一个基于摄取时间的字段是行不通的。
---------- # non-working example filter{ if "%{+HH}:%{+mm}" < "16:30" { mutate { add_field => { "string_compare" => "%{+HH}:%{+mm} is before 16:30" } } } } ----------
这个变通方法给你带来了预期的结果:
filter { mutate{ add_field => { "[@metadata][time]" => "%{+HH}:%{+mm}" } } if [@metadata][time] < "16:30" { mutate { add_field => { "string_compare" => "%{+HH}:%{+mm} is before 16:30" } } } }
在配置文件中使用环境变量