2014-11-24 105 views
1

我在Mongo中有很多syslog文档,下面是一个示例。我想要做的是按日/小时/月将它们分组在图表中。该值将是一段时间内文档的计数。在MongoDB中按小时分组的时间戳

{ 
    u'syslog_message': u'[10724525.839722] [UFW BLOCK] IN=venet0 OUT= MAC= SRC=1.2.3.4 DST=9.8.7.6 LEN=52 TOS=0x08 PREC=0x20 TTL=50 ID=55384 PROTO=TCP SPT=349 DPT=123 WINDOW=14600 RES=0x00 SYN URGP=0 ', 
    u'received_from': u'1.3.5.7:1234', 
    u'@version': u'1', 
    u'@timestamp': datetime.datetime(2014, 11, 20, 15, 9, 55), 
    u'syslog_timestamp': u'Nov 20 15:09:55', 
    u'syslog_facility': u'user-level', 
    u'syslog_severity': u'notice', 
    u'host': u'2.4.6.8:2468', 
    u'syslog_program': u'kernel', 
    u'syslog_hostname': u'server01', 
    u'received_at': u'2014-11-20 20:09:55 UTC', 
    u'message': u'<4>Nov 20 15:09:55 server01 kernel: [10724525.839722] [UFW BLOCK] IN=venet0 OUT= MAC= SRC=1.2.3.4 DST=2.3.4.5 LEN=52 TOS=0x08 PREC=0x20 TTL=50 ID=55384 PROTO=TCP SPT=1234 DPT=543 WINDOW=14600 RES=0x00 SYN URGP=0 ', 
    u'_id': ObjectId('546e4a93e98673fe8f11a4d2'), 
    u'type': u'syslog', 
    u'syslog_severity_code': 5, 
    u'syslog_facility_code': 1 
} 

我使用Chartkick在Python呈现这个数据与瓶,其结果是好的,但所有的消息都在图表逐个。我想te做桶,数月,数周,数小时等。

为此,我可以使用'@timestamp'键中的值。这工作得很好,但在Python中的计数分组装置,首先检索所有文件,并不能是正确的:d


问:

是什么,我可以使用内Pymongo得到正确的查询count_by_week等等,或者我应该在服务器上使用类似聚合的东西,这是什么样的?

mongo dashboard 四台服务器,由于缺少计时分组,所以请注意上面的扁平线。

回答

2

您可能希望在插入时更新计数,如@alernerdev所示,或者您想要服务器上的聚合。我对Pymongo不熟悉,但看起来它使用的语法非常类似于我使用的MongoDB的JavaScript驱动程序。因此,要做到这一点作为一个服务器端aggregation,你会做这样的事情:

db.logs.aggregate([ 
     {"$group": {"_id": {"week": {"$week": "[email protected]"}, "year": {"$year": "[email protected]"}}, "count": {"$sum": 1}}} 
    ]) 

这将组逐年周的和日志条目,并计算各组中的文档数量。

+0

谢谢,我认为这将工作,我的时间戳不在Mongo需要的格式,所以我不能告诉当然。 “无法从BSON类型字符串转换为日期” – Thijs 2014-11-25 08:04:35

+1

将字符存储为字符串是一个错误 - 例如,您不能执行范围搜索。它是一个常见的错误,但你需要改变它 – alernerdev 2014-11-25 12:14:39

1

您应该以与您在检索过程中将如何使用它相匹配的方式来构建您的模式 - 换句话说,在进入数据库的过程中进行数据聚合。对于每个插入,使用$ inc和$ set并更新小时,星期,星期等所需的任何统计数据。

+0

是的,这听起来不错。但我没有找到如何建立这样的摄取改造。有很多例子,但不是他们去的地方,如何查看它们,改变它们等。你有没有指针? – Thijs 2014-11-25 08:06:39

+1

看看http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/ ----它会给你提供点子。你想谷歌的关键字是“前聚合” – alernerdev 2014-11-25 12:12:38

+0

我已经分裂这个问题,是不是聪明的我结合两个主题。我的问题的其他一半是在这里:http://stackoverflow.com/questions/27129194/data-transformation-during-load – Thijs 2014-11-25 14:24:41