Chinaunix首页 | 论坛 | 博客
  • 博客访问: 457038
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1575
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-20 17:02
文章分类

全部博文(153)

文章存档

2017年(111)

2016年(42)

我的朋友

分类: 数据库开发技术

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)" } 

同时,在这个过程中,如果你觉得有些字段对数据分析没有任何帮助,则可以直接过滤掉,以减少存储上的消耗,比如

  • 数据分析不会关心user信息、request、status信息,这几个字段没必要存储
  • ObjectId里本身包含了时间信息,没必要再单独存储一个time字段 (当然带上time也有好处,time更能代表请求产生的时间,而且查询语句写起来更方便,尽量选择存储空间占用小的数据类型)

基于上述考虑,一行日志最终存储的内容可能类似如下

{ _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 来控制日志写入能力,猛击这里详细了解

阅读全文请点击:

阅读(2062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~