我想知道使用Logstash Grok过滤器的最佳方法是什么.我有一些特定日志条目的过滤器,不适用于所有条目.那些不适用的标签始终生成_grokparsefailure标签.例如,我有一个grok过滤器,用于每个日志条目,它工作正常.然后我有另一个过滤器,用于带有回溯的错误消息.回溯过滤器为每个没有回溯的日志条目抛出grokparsefailure.
如果没有匹配而不是添加parsefailure标记,我宁愿让它只是通过规则.我使用parsefailure标签来查找未正确解析的内容,而不是与特定过滤器不匹配的内容.也许只是命名"解析失败"才能得到我.对我而言,这意味着过滤器出现了问题(例如格式错误),而不是它不匹配.
所以问题是,我该如何处理?
使用过滤器模式可选吗?
(ab)使用tag_on_failure选项将其设置为空[]
使用诸如"if ifback in message"之类的东西使过滤器有条件
还有别的什么我不考虑?
提前致谢.
编辑
我采取了在过滤器周围添加条件的路径:
if [message] =~ /took\s\d+/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
add_tag => [ "stats", "servicetime" ]
}
}
Run Code Online (Sandbox Code Playgroud)
仍然对反馈感兴趣.什么被认为是"最佳实践"?
在我的系统中,数据的插入总是通过logstash通过csv文件完成.我从未预先定义映射.但每当我输入一个字符串,它总是被认为是analyzed,作为结果的条目一样hello I am Sinha被分为hello,I,am,Sinha.无论如何我可以更改elasticsearch的默认/动态映射,以便所有字符串,无论索引如何,无论类型如何都被认为是not analyzed?或者有没有办法在.conf文件中设置它?说我的conf文件看起来像
input {
file {
path => "/home/sagnik/work/logstash-1.4.2/bin/promosms_dec15.csv"
type => "promosms_dec15"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
columns => ["Comm_Plan","Queue_Booking","Order_Reference","Multi_Ordertype"]
separator => ","
}
ruby {
code => "event['Generation_Date'] = Date.parse(event['Generation_Date']);"
}
}
output {
elasticsearch {
action => "index"
host => "localhost"
index => "promosms-%{+dd.MM.YYYY}"
workers => 1
}
}
Run Code Online (Sandbox Code Playgroud)
我想要所有的字符串 …
我有一个自定义生成的日志文件,具有以下模式:
[2014-03-02 17:34:20] - 127.0.0.1|ERROR| E:\xampp\htdocs\test.php|123|subject|The error message goes here ; array (
'create' =>
array (
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
),
)
[2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line
Run Code Online (Sandbox Code Playgroud)
第二个条目[2014-03-02 17:34:20] - 127.0.0.1|DEBUG| flush_multi_line是一个虚拟行,只是为了让logstash知道多行事件结束,稍后将删除此行.
我的配置文件如下:
input {
stdin{}
}
filter{
multiline{
pattern => "^\["
what => "previous"
negate=> true
}
grok{
match => ['message',"\[.+\] - %{IP:ip}\|%{LOGLEVEL:loglevel}"]
}
if [loglevel] == "DEBUG"{ # the event flush line
drop{}
}else if [loglevel] == "ERROR" { …Run Code Online (Sandbox Code Playgroud) 我有一个远程机器,它结合了多行事件并通过伐木工人协议发送它们.
是什么东西看起来像这样:
{
"message" => "2014-10-20T20:52:56.133+0000 host 2014-10-20 15:52:56,036 [ERROR ][app.logic ] Failed to turn message into JSON\nTraceback (most recent call last):\n File \"somefile.py", line 249, in _get_values\n return r.json()\n File \"/path/to/env/lib/python3.4/site-packages/requests/models.py\", line 793, in json\n return json.loads(self.text, **kwargs)\n File \"/usr/local/lib/python3.4/json/__init__.py\", line 318, in loads\n return _default_decoder.decode(s)\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 343, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 361, in raw_decode\n raise ValueError(errmsg(\"Expecting value\", s, err.value)) from None\nValueError: Expecting value: line 1 column 1 (char 0), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用grok解析日志文件
日志文件的每一行都有以逗号分隔的字段:
13,home,ABC,Get,,Private, Public,1.2.3 ecc...
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的匹配:
match => [ "message", "%{NUMBER:requestId},%{WORD:ServerHost},%{WORD:Service},...
我的问题是:我可以允许可选字段吗?有时一些文件可能是空的,,
有没有匹配像这样的字符串的模式2.3.5?(一种版本号)
grok模式的语法是%{SYNTAX:SEMANTIC}.如何生成所有可用SYNTAX关键字的列表?我知道我可以使用grok调试器从文本中发现模式.但是有一个我可以扫描的列表吗?
我有JSON文件,我通过logstash发送给ES.我想在JSON中删除1个字段(它是深字段) - 仅当值为NULL时才会删除.
JSON的一部分是:
"input": {
"startDate": "2015-05-27",
"numberOfGuests": 1,
"fileName": "null",
"existingSessionId": "XXXXXXXXXXXXX",
**"radius": "null",**
"nextItemReference": "51",
"longitude": -99.12,
"endDate": "2015-05-29",
"thumbnailHeight": 200,
"thumbnailWidth": 300,
"latitude": 19.42,
"numOfRooms": "1"
},
Run Code Online (Sandbox Code Playgroud)
该logstash.conf文件的一部分是:
if [input.radius] == "null" {
mutate {
remove_field => [ "input.radius" ]
}
}
Run Code Online (Sandbox Code Playgroud)
当然这是在过滤器内部.
如果值为null,如何删除此字段?
我试图解析我的apache2错误日志,我有点麻烦..它似乎没有匹配过滤器.我很确定时间戳是错误的,但我不确定,我真的找不到任何文件来解决它.另外,有没有办法让fields.errmsg我得到什么@message?
日志
[Wed Jun 26 22:13:22 2013] [error] [client 10.10.10.100] PHP Fatal error: Uncaught exception '\Foo\Bar'
Run Code Online (Sandbox Code Playgroud)
托运人配置
input {
file {
'path' => '/var/log/apache2/*-error.log'
'type' => 'apache-error'
}
}
filter {
grok {
type => "apache-error"
pattern => "\[%{HTTPDATE:timestamp}\] \[%{WORD:class}\] \[%{WORD:originator} %{IP:clientip}\] %{GREEDYDATA:errmsg}"
}
}
output {
stdout {}
redis {
'data_type' => 'list'
'host' => 'logstash.server.net'
'key' => 'logstash'
}
}
Run Code Online (Sandbox Code Playgroud) 背景:
我们rsyslog创建了日志文件目录,例如:/var/log/rsyslog/SERVER-NAME/LOG-DATE/LOG-FILE-NAME
因此,多个服务器将不同日期的日志分发到中心位置.
现在阅读这些日志并将它们存储在elasticsearch中进行分析我的logstash配置文件是这样的:
file{
path => /var/log/rsyslog/**/*.log
}
Run Code Online (Sandbox Code Playgroud)
问题 :
现在,随着目录中日志文件数量的增加,logstash会为新文件打开文件描述符(FD),并且不会为已读取的日志文件释放FD.由于日志文件是按日期生成的,因此一旦读取它,之后就没有用了,因为在该日期之后它不会被更新.
我已将文件开口限制增加到65K in /etc/security/limits.conf
我们可以在一段时间后让logstash关闭句柄,这样打开的文件句柄数量不会增加太多?
我遇到了grok解析的问题.在ElasticSearch/Kibana中,我匹配的行带有标签_grokparsefailure.
这是我的logstash配置:
input {
file {
type => logfile
path => ["/var/log/mylog.log"]
}
}
filter {
if [type] == "logfile"
{
mutate {
gsub => ["message","\"","'"]
}
grok
{ match => { "message" => "L %{DATE} - %{TIME}: " } }
}
}
output {
elasticsearch { host => localhost port => 9300 }
}
Run Code Online (Sandbox Code Playgroud)
线条/图案我想要匹配:L 08/02/2014 - 22:55:49:日志文件已关闭:"已完成"
我在http://grokdebug.herokuapp.com/上尝试了调试器,它运行正常,我的模式匹配正确.
我想解析的行可能包含双引号,我读过可能存在grok处理和转义它们的问题.所以我试图改变以替换"与'以避免问题,但没有运气.
有任何想法吗 ?我该怎么调试呢?
谢谢