elasticsearch 连接两个独立事件的Kibana
我已将ELK配置为脱机收集数据,日志文件如下所示:elasticsearch 连接两个独立事件的Kibana,elasticsearch,logstash,kibana,elasticsearch,Logstash,Kibana,我已将ELK配置为脱机收集数据,日志文件如下所示: Info 2015-08-15 09:33:37,522 User 3 connected Info 2015-08-15 10:03:57,592 User 99 connected Info 2015-08-15 11:42:37,522 User 99 disconnected Info 2015-08-15 11:49:12,108 User 3 disconnected 我要找的是时间线上的平均连接时间 我无法向消息中添加更多信
Info 2015-08-15 09:33:37,522 User 3 connected
Info 2015-08-15 10:03:57,592 User 99 connected
Info 2015-08-15 11:42:37,522 User 99 disconnected
Info 2015-08-15 11:49:12,108 User 3 disconnected
我要找的是时间线上的平均连接时间
我无法向消息中添加更多信息,特别是我无法向断开连接消息中添加连接时间 Elasticsearch的一个缺点是它不是一个关系型数据库,所以交叉引用要有限得多。有一篇很好的关于它的博文: 但长短不一的是,没有一种方法可以直接查询这类事情。每个事件都是索引中的一个离散文档,没有任何形式的交叉引用 所以你必须用艰难的方式去做。在最简单的级别,即查询所有连接事件,查询所有断开连接事件,并将它们与脚本语言关联起来 通过使用
grok
过滤器对日志进行预筛选,将字段添加到数据库中,可以稍微简化这一过程
if [type] == "syslog" and [message] =~ /connected/ {
grok {
match => [ "message", "User %{POSINT:userid} %{WORD:conn}" ]
}
}
这将添加一个userid
和conn
字段(包含“已连接”或“已断开连接”)
但是您仍然需要使用您最喜欢的脚本语言手动将查询与数据库获取关联起来(因此只需在脚本中执行“搜索和筛选”) 如果使用Logstash加载ES,可以使用过滤器来组装相关的离散日志行。我们的想法是注意一个长期事件何时开始(即用户连接),然后在同一用户的
断开连接的事件飞过时结束它:(注意,您的grok模式可能不同,但原理相同)
您将得到一个名为duration
(以毫秒为单位)的附加字段,然后可以使用该字段在Kibana上绘制平均连接时间
还要注意,我给出了一天的任意超时时间,这可能适合您的情况,也可能不适合您的情况。您可以随意玩。如何将这些日志加载到ES中?使用logstash?你能使用logstash过滤器吗?是的:)我想这会很好用的!我大约有一周左右的时间来测试它,可能会更多。一旦它起作用,我将把答案标记为已接受!非常感谢!如果这有帮助的话,我很高兴。当你有时间的时候一定要告诉我们!你能试一下吗?
filter {
grok {
match => [ "message", "%{LOGLEVEL:loglevel} %{TIMESTAMP_ISO8601:timestamp} %{WORD:entity} %{INT:userid} %{WORD:status}" ]
}
if [status] == "connected" {
aggregate {
task_id => "%{userid}"
code => "map['started'] = event['timestamp']"
map_action => "create"
}
}
if [status] == "disconnected" {
aggregate {
task_id => "%{userid}"
code => "event['duration'] = event['timestamp'] - map['started']"
map_action => "update"
end_of_task => true
timeout => 86400000
}
}
}