mongodb存储日志

本文探讨了业务系统中日志统计的需求与挑战,提出了利用MongoDB进行日志存储及统计的解决方案,包括搭建MongoDB集群、设计统计平台等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在考虑架构的事情,有一个问题依然困扰着我们这些做业务系统的,那就是日志以及日志统计。大概的问题如下:

  1. 我们有很多模块,日志格式虽然类似但都写在各自的服务器和目录中。
  2. 日志中有很多信息是key=>value格式的数据。
  3. 通常一个功能上线后,PM或者需求方都会要求一些统计数据以及报表之类,用来跟踪功能的使用效果。通常PM是不懂写程序的,因此统计数据的事情多半又提给RD。
  4. 这种统计数据和报表,价值随着时间的流逝而递减,到了某个时间就不再有价值,不再有人关心,而统计程序还在跑,保不齐哪天又要维护,都忘了部署在哪了。
  5. 日志存储占用空间,需要定期删除
  6. web服务器镜像很多,日志通常也是多份,处理时需要合并
  7. web服务器有时要调整,下线了web服务器一般日志也就丢了

我是个懒人,做好了功能之后,对于这种数据统计的需求通常都很反感,因为数据挖掘这种事情总的来说很考验灵感,所以需求总变化,今儿要这样的数,明儿要那样的数。一个理想情况是PM都会SQL,然后RD把数据都灌入数据库,以前我们组的那几个NB的PM还在的时候,经常这么搞的,现在是不行了。还有一个问题就是数据库不是schema free的,格式不那么自由,需要事先设计好,这也架不住需求老变。

日志统计这种事情,通常有以下特点:

  1. 大数据量,每天可能有上G的数据(业务数据)
  2. 写频繁,读不频繁(几乎每个PV都会产生若干条日志数据)
  3. 统计服务可以任务化,不需要实时
  4. 不许要绝对的数据一致性

按照这个特点,MongoDb算是挺合适的选择,原因是:

  1. schema free,随时可以加需要的字段进去
  2. 可扩展性极佳,不用太担心存储空间不够问题
  3. 写的时候可以异步,不用太担心占用请求响应的时间
  4. 对于collection,可以规定固定大小(capped collection) ,比如100G,这样mongodb会按照LRU算法来复用空间,不用惦记着删日志
  5. 可以支持一般的查询条件和聚集,并且提供Javascript Shell,这样可以让有志于自己分析数据的PM自学编写统计脚本,最终让RD摆脱这样的工作

虽然培养RD的产品意识是好的,但统计产品使用数据这样的事情,确确实实让RD提不起兴趣,以前部门曾有过一个产品,从各产品线抓取数据然后记录在数据库并提供报表展示,但总的来说灵活性很低,一来双方要定接口,二来统计的事情其实还是要RD做好,只是省下了做数据展现的工作。

现在的想法是搭建mongodb集群,用来集中存储业务日志的数据,然后在mongodb之上搭建一个平台用于处理一般的数据统计需求,允许编写一些任务放在平台上运行,而这些任务可以用统一的javascript语言来编写。对于相对小数据量(我们的业务系统,相比较检索端的日志来说算是小数据量了,一天上G数据都算大的)的需求来说,不失为一种不错的方案,主要目的是解决维护和管理的问题。

ref:http://blog.youkuaiyun.com/sandysong28/article/details/6455926

### 如何使用MongoDB进行日志存储的最佳实践 #### 日志存储的设计原则 为了有效地利用MongoDB作为日志存储解决方案,设计阶段应考虑几个重要因素。首先,考虑到日志量可能非常大,应当规划好分片策略以支持水平扩展和高效读取性能[^1]。 #### 数据模型的选择 针对不同的应用场景可以选择合适的数据结构。例如,在记录应用系统的操作行为时,可以采用嵌入式文档形式保存每次请求的相关信息;而对于频繁更新的日志条目,则更适合扁平化的模式减少写放大效应。此外,合理设置TTL(Time To Live)索引来自动清理过期日志也是提高系统效率的重要手段之一。 #### 运行日志的管理 关于MongoDB自身的运行日志,可以通过调整`mongod.conf`文件中的参数控制其输出级别与路径,并启用轮转功能防止单个文件过大影响性能或占用过多磁盘空间。具体来说,通过配置`logRotate=rename`选项可以在达到一定大小后重命名当前日志并创建新的日志文件继续记录新产生的事件。 #### 安全性和可靠性保障措施 当把敏感业务数据存放到NoSQL数据库里之前,必须做好充分的安全评估工作。这不仅涉及到访问权限控制方面的要求,还包括传输过程加密以及定期备份恢复测试等内容。另外,由于缺乏严格的事务特性,建议开发者们在编写应用程序逻辑的时候特别注意处理并发冲突的可能性[^2]。 #### 性能优化技巧 最后但同样重要的是要关注查询性能调优。尽管MongoDB内置了一些工具帮助管理员理解现有集合上的常见查询模式从而做出更好的决策,但仍需主动监控实际生产环境下的表现状况以便及时作出相应调整。比如适当增加内存分配给缓存层或者重新审视已有的复合索引定义是否仍然适用最新的需求变化等举措都能带来显著的效果提升[^3]。 ```javascript // 创建带有 TTL 的集合用于临时日志存储 db.createCollection("sessionLogs", { capped: false, autoIndexId: true, validationLevel: "strict", validationAction: "error" }); // 设置 TTL 索引使超过一天的日志自动删除 db.sessionLogs.createIndex({ "createdAt": 1 }, { expireAfterSeconds: 86400 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值