分类: 数据库开发技术
2017-01-05 16:53:00
线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误、警告、及用户行为等信息,通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题,但当产生大量的日志之后,要想从大量日志里挖掘出有价值的内容,则需要对数据进行进一步的存储和分析。
本文以存储 web 服务的访问日志为例,介绍如何使用 MongoDB 来存储、分析日志数据,让日志数据发挥最大的价值,本文的内容同样使用其他的日志存储型应用。
一个典型的web服务器的访问日志类似如下,包含访问来源、用户、访问的资源地址、访问结果、用户使用的系统及浏览器类型等
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "[]()" "Mozilla/4.08 [en] (Win98; I ;Nav)"
最简单存储这些日志的方法是,将每行日志存储在一个单独的文档里,每行日志在MongoDB里类似
{
_id: ObjectId('4f442120eb03305789000000'),
line: '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "[]()" "Mozilla/4.08 [en] (Win98; I ;Nav)"'
}
上述模式虽然能解决日志存储的问题,但使得这些数据分析起来比较麻烦,因为文本分析并不是MongoDB所擅长的,更好的办法时,在把一行日志存储到MongoDB的文档里前,先提取出各个字段的值,如下所示,上述的日志被转换为一个包含很多个字段的文档。
{ _id: ObjectId('4f442120eb03305789000000'), host: "127.0.0.1", logname: null, user: 'frank', time: ISODate("2000-10-10T20:55:36Z"), path: "/apache_pb.gif", request: "GET /apache_pb.gif HTTP/1.0", status: 200, response_size: 2326, referrer: "[]()", user_agent: "Mozilla/4.08 [en] (Win98; I ;Nav)" }
同时,在这个过程中,如果你觉得有些字段对数据分析没有任何帮助,则可以直接过滤掉,以减少存储上的消耗,比如
基于上述考虑,一行日志最终存储的内容可能类似如下
{ _id: ObjectId('4f442120eb03305789000000'),
host: "127.0.0.1",
time: ISODate("2000-10-10T20:55:36Z"),
path: "/apache_pb.gif",
referer: "[]()",
user_agent: "Mozilla/4.08 [en] (Win98; I ;Nav)" }
日志存储服务需要能同时支持大量的日志写入,用户可以定制 writeConcern 来控制日志写入能力,猛击这里详细了解
阅读全文请点击: