ELK logstash 配置语法(24th)
<h3>数据类型</h3><p>logstash支持的数据类型有:</p>
<ul>
<li>array<br>
数组可以是单个或者多个字符串值。<br><span class="pln"> path </span><span class="pun">=></span> <span class="pun">[</span> <span class="str">"/var/log/messages"</span><span class="pun">,</span> <span class="str">"/var/log/*.log"</span> <span class="pun">]</span><span class="pln"><br>
path </span><span class="pun">=></span> <span class="str">"/data/mysql/mysql.log"<br></span>如果指定了多次,追加数组。此实例path数组包含三个字符串元素。</li>
<li>boolean<br>
布尔值必须是TRUE或者false。true和false不能有引号。<br><span class="pln"> ssl_enable </span><span class="pun">=></span> <span class="kwd">true</span>
</li>
<li>bytes<br>
指定字节单位。支持的单位有SI (k M G T P E Z Y) 和 Binary (Ki Mi Gi Ti Pi Ei Zi Yi)。Binary单位基于1024,SI单位基于1000。不区分大小写和忽略值与单位之间的空格。如果没有指定单位,默认是byte。<br><span class="pln"> my_bytes </span><span class="pun">=></span> <span class="str">"1113"</span> <span class="pun">#</span> <span class="lit">1113</span><span class="pln"> bytes<br>
my_bytes </span><span class="pun">=></span> <span class="str">"10MiB"</span> <span class="pun">#</span> <span class="lit">10485760</span><span class="pln"> bytes<br>
my_bytes </span><span class="pun">=></span> <span class="str">"100kib"</span> <span class="pun">#</span> <span class="lit">102400</span><span class="pln"> bytes<br>
my_bytes </span><span class="pun">=></span> <span class="str">"180 mb"</span> <span class="pun">#</span> <span class="lit">180000000</span><span class="pln"> bytes</span>
</li>
<li>Codec<br>
logstash编码名称用来表示数据编码。用于input和output段。便于数据的处理。如果input和output使用合适的编码,就无需单独的filter对数据进行处理。<br><span class="pln">codec </span><span class="pun">=></span> <span class="str">"json"</span>
</li>
<li>hash<br>
键值对,注意多个键值对用空格分隔,而不是逗号。<br><span class="pln">match </span><span class="pun">=></span> <span class="pun">{</span><br><span class="str">"field1"</span> <span class="pun">=></span> <span class="str">"value1"</span><br><span class="str">"field2"</span> <span class="pun">=></span> <span class="str">"value2"</span><br><span class="pun">...</span> <span class="pun">}</span>
</li>
<li>number<br>
必须是有效的数值,浮点数或者整数。<br><span class="pln">port </span><span class="pun">=></span> <span class="lit">33</span>
</li>
<li>password<br>
一个单独的字符串。<br><span class="pln">my_password </span><span class="pun">=></span> <span class="str">"password"</span>
</li>
<li>path<br>
一个代表有效的操作系统路径。<br><span class="pln">my_path </span><span class="pun">=></span> <span class="str">"/tmp/logstash"</span>
</li>
<li>string<br><span class="pln"> name </span><span class="pun">=></span> <span class="str">"Hello world"</span><span class="pln"><br>
name </span><span class="pun">=></span> <span class="str">'It\'s a beautiful day'</span>
</li>
</ul>
<h3>字段引用</h3>
<p>logstash字段引用语法。要在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。还需注意字段层次。如果引用的是一个顶级字段,可以省略[],直接指定字段名。要引用嵌套的字段,需要指定完整的路径,如。</p>
<p>下面有五个顶级字段(agent, ip, request, response, ua) 和三个嵌套字段 (status, bytes, os)。</p><pre class="brush:bash;toolbar:false">{
"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"
}
}</pre><p>为了引用os字段,需指定。引用顶级字段如request,可以简单指定request即可。</p>
<h3>sprintf格式</h3>
<p>字段引用格式也可以用于logstash调用sprintf格式。这种格式可以从其他字符串中引用字段值。如:</p><pre class="brush:bash;toolbar:false">output {
statsd {
increment => "apache.%{}"
}
}</pre><p>也可以格式化时间。如:</p><pre class="brush:bash;toolbar:false">output {
file {
path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}"
}
}</pre><p></p>
<h3>条件判断</h3>
<p>使用条件来决定filter和output处理特定的事件。</p>
<p>logstash条件类似于编程语言。条件支持if、else if、else语句,可以嵌套。</p>
<p>条件语法如下:</p><pre class="brush:bash;toolbar:false">if EXPRESSION {
...
} else if EXPRESSION {
...
} else {
...
}</pre><p>比较操作有:</p>
<ul class="itemizedlist" type="disc">
<li class="listitem">相等: <code class="literal">==</code>, <code class="literal">!=</code>, <code class="literal"><</code>, <code class="literal">></code>, <code class="literal"><=</code>, <code class="literal">>=</code>
</li>
<li class="listitem">正则: <code class="literal">=~(匹配正则)</code>, <code class="literal">!~(不匹配正则)</code>
</li>
<li class="listitem">包含: <code class="literal">in(包含)</code>, <code class="literal">not in(不包含)</code>
</li>
</ul>
<p>布尔操作:</p>
<ul class="itemizedlist" type="disc">
<li class="listitem">
<code class="literal">and(与)</code>, <code class="literal">or(或)</code>, <code class="literal">nand(非与)</code>, <code class="literal">xor(非或)</code>
</li>
</ul>
<p>一元运算符:</p>
<ul class="itemizedlist" type="disc">
<li class="listitem"><code class="literal">!(取反)</code></li>
<li class="listitem">
<code>()</code>(复合表达式), <code>!()</code>(对复合表达式结果取反)</li>
</ul>
<p>如mutate filter删除secret字段对于action是login的:</p><pre class="brush:bash;toolbar:false">filter {
if == "login" {
mutate { remove => "secret" }
}
}</pre><p>在一个条件里指定多个表达式:</p><pre class="brush:bash;toolbar:false">output {
# Send production errors to pagerduty
if == "ERROR" and == "production" {
pagerduty {
...
}
}
}</pre><p>在in条件,可以比较字段值:</p><pre class="brush:bash;toolbar:false">filter {
if in {
mutate { add_tag => "field in field" }
}
if in "foo" {
mutate { add_tag => "field in string" }
}
if "hello" in {
mutate { add_tag => "string in field" }
}
if in ["hello", "world", "foo"] {
mutate { add_tag => "field in list" }
}
if in {
mutate { add_tag => "shouldnotexist" }
}
if !("foo" in ["hello", "world"]) {
mutate { add_tag => "shouldexist" }
}
}</pre><p></p><pre class="brush:bash;toolbar:false">output {
if "_grokparsefailure" not in {
elasticsearch { ... }
}
}</pre><p>字段引用、sprintf格式、条件判断只能用于filter和output,不能用于input。</p>
<h3>@metadata字段</h3>
<p>在logstash1.5版本开始,有一个特殊的字段,叫做@metadata。@metadata包含的内容不会作为事件的一部分输出。</p><pre class="brush:bash;toolbar:false">input { stdin { } }
filter {
mutate { add_field => { "show" => "This data will be in the output" } }
mutate { add_field => { "[@metadata]" => "Hello" } }
mutate { add_field => { "[@metadata]" => "This data will not be in the output" } }
}
output {
if [@metadata] == "Hello" {
stdout { codec => rubydebug }
}
}</pre><p>查看输出:</p><pre class="brush:bash;toolbar:false">$ bin/logstash -f ../test.conf
Logstash startup completed
asdf
{
"message" => "asdf",
"@version" => "1",
"@timestamp" => "2015-03-18T23:09:29.595Z",
"host" => "www.ttlsa.com",
"show" => "This data will be in the output"
}</pre><p>"asdf"变成message字段内容。条件与@metadata内嵌的test字段内容判断成功,但是输出并没有展示@metadata字段和其内容。</p>
<p>不过,如果指定了metadata => true,rubydebug codec允许显示@metadata字段的内容。</p><pre class="brush:bash;toolbar:false">stdout { codec => rubydebug { metadata => true } }</pre><p>下面是输出的内容:</p><pre class="brush:bash;toolbar:false">$ bin/logstash -f ../test.conf
Logstash startup completed
asdf
{
"message" => "asdf",
"@version" => "1",
"@timestamp" => "2015-03-18T23:10:19.859Z",
"host" => "www.ttlsa.com",
"show" => "This data will be in the output",
"@metadata" => {
"test" => "Hello",
"no_show" => "This data will not be in the output"
}
}</pre><p>可以看到@metadata字段及其子字段内容。</p>
<p>注意:只有rubydebug codec可以显示@metadata字段内容。</p>
<p>确保@metadata字段临时需要,不希望最终输出。最常见的情景是filter的时间字段,需要一临时的时间戳。如:</p><pre class="brush:bash;toolbar:false">input { stdin { } }
filter {
grok { match => [ "message", "%{HTTPDATE:[@metadata]}" ] }
date { match => [ "[@metadata]", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}
output {
stdout { codec => rubydebug }
}</pre><p>输出结果:</p><pre class="brush:bash;toolbar:false">$ bin/logstash -f ../test.conf
Logstash startup completed
02/Mar/2014:15:36:43 +0100
{
"message" => "02/Mar/2014:15:36:43 +0100",
"@version" => "1",
"@timestamp" => "2014-03-02T14:36:43.000Z",
"host" => "example.com"
}</pre><p></p>
頁:
[1]