从日志文件中抽出时间

时间:2017-09-29 04:32:39

标签: elasticsearch logstash kibana filebeat

以下是原始日志:

2017-09-17 08:34:54 181409 10.110.82.122 200 TCP_TUNNELED 4440 1320 CONNECT tcp cdn.appdynamics.com 443 / - ANILADE - 10.100.134.6 - - “Mozilla / 5.0(Windows NT 10.0; Win64; x64) )AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.113 Safari / 537.36“OBSERVED”Technology / Internet“ - 10.100.134.6

这是我的logstash配置文件:

<script type="text/javascript" src="/jquery-3.2.1.min.js"></script>

<script>
    $(document).ready(function() {
       $('#feedback_email').load('/check.php').show();

       $('#email').keyup(function() {
           $.post('/check.php', { email: form.email.value }, 
           function(result) {
               $('#feedback_email').html(result).show;
           });
       });
    });
</script>

<form action="register.php" method="post" name="form">

<input id="email" type="text" name="email" placeholder="Email Address" maxlength="60" value="<?php if (isset($trimmed['email'])) echo $trimmed['email']; ?>">

<div id="feedback_email"></div>

<p><center><input type="submit" name="submit" value="Register"></center>
</form>

我想从日志中选择时间,因此我按照Date Plugin文档中的建议使用了日期过滤器。但无论配置如何,当我在Kibana中查看时,我可以看到logstash elasticsearch在@timestamp字段中显示索引时间。我找不到我错过的或错在哪里。我试着用

替换它来在grok过滤器中使用TIMESTAMP_ISO8601
} elseif (str($email).indexOf('@') == -1) {

并将字段时间戳添加为:

input {
    beats {
        port => "5044"
    }
}

filter 
#start of filter
{
grok 
#start of grok filter
{
match =>
#start of match
{"message"=>"%{TIMESTAMP_ISO8601:@timestamp} (%{NUMBER:time_taken}|\-) (%{IP:sourceIP}|\-) (%{NUMBER:status}|\-) (%{WORD:action}|\-) (%{NUMBER:scBytes}|\-) (%{NUMBER:csBytes}|\-) (%{WORD:method}|\-) (%{WORD:uri_scheme}|\-) (%{URIHOST:url}|\-) (%{NUMBER:port}|\-) (?<uri_path>([a-zA-Z0-9\/\.\?\-\_]+)|(\/)) (?<uri_query>([a-zA-Z0-9\/\.\?\-\=\&\%]+)) (?<username>([a-zA-Z0-9\/\.\?\-]+)) (?<auth_group>([a-zA-Z0-9\/\.\?\-]+)) (?<destIP>([a-zA-Z0-9\.\-]+)) (?<content_type>([a-zA-Z0-9\-\/\;\%\=]+)) (?<referer>[a-zA-Z0-9\-\/\;\%\=\:\.]+) (%{QUOTEDSTRING:user_agent}|\-) (%{WORD:filter_result}|\-) (%{QUOTEDSTRING:category}|\-) (?<vir_id>([a-zA-Z0-9\-\/.])) (%{IP:proxyIP}|\-)"
}
#end of match
}
#end of grok
date
#start of date filter
{
match=>["@timestamp","ISO8601"]
}
#end of date filter
}
#end of filter


output 
{

    elasticsearch 
    {
    hosts => ["localhost:9200"] 
    index => proxylog
    }
}

然后将日期过滤器配置更改为

%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{TIME:time}

发现没有运气。有人可以指出一个解决方案,因为在elasticsearch和stackoverflow论坛上发现的任何链都没有帮助。任何人都可以告诉我是否需要更改filebeat的任何配置,因为我使用filebeat将日志发送到logstash。

2 个答案:

答案 0 :(得分:1)

您可以在日期过滤器中添加target => "new_field"并使用它在Kibana中创建索引

答案 1 :(得分:0)

可能是因为@timestamp是一个时间戳字段,但你的grok {}将它视为一个字符串。

首先,将字符串转换为新字段,例如

%{TIMESTAMP_ISO8601:[@metadata][timestamp]}

然后使用[@metadata] [timestamp]作为输入的日期{}过滤器设置@timestamp。