MongoDB中的日志系统

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介: 本文是一篇源码导读类文章,主要是写给MongoDB的开发者看的,首先会简单介绍一下MongoDB的日志系统的组成,然后会再介绍一下如何使用。 日志系统组成 首先介绍一下日志系统的几个基本组件和概念。 Encoder Encoder类负责对日志格式化,在不同的场景可能需要不同格式的日志,比如输

本文是一篇源码导读类文章,主要是写给MongoDB的开发者看的,首先会简单介绍一下MongoDB的日志系统的组成,然后会再介绍一下如何使用。

日志系统组成

首先介绍一下日志系统的几个基本组件和概念。

Encoder

Encoder类负责对日志格式化,在不同的场景可能需要不同格式的日志,比如输出到console和文件可以使用一种格式,输出到syslog用另一种格式,还有些时候是不需要特定格式,直接输出raw信息即可。那么只要定义一个特定格式的派生类,实现对应的encode()接口即可。MongoDB目前定义了以下3种Encoder分别用于console/文件、syslog和raw:

  • MessageEventDetailsEncoder
  • MessageEventWithContextEncoder
  • MessageEventUnadornedEncoder

Appender

和其他日志系统一样,Appender就是日志输出到什么地方,常见的有Console、File、syslog等。作为一个服务,日志切割是普遍需求,为此MongoDB实现了一个RotatableFileAppender结合RotatableFileWriter和RotatableFileManager来实现这个功能。
每个Appender类有一个append()接口,所有派生类都需要实现这个接口。Appender类在构造时需要指定一个Encoder,append()的时候调用Encoder的encode()接口对日志进行格式化,然后再输出。MongoDB目前定义了以下几种Appender分别用于console、File和syslog输出:

  • ConsoleAppender
  • RotatableFileAppender
  • SyslogAppender

LogDomain

LogDomain可以理解为用来对日志按照业务类型进行分类(Domain)。这里业务类型是一个抽象的说法,具体可以是普通的程序日志、或是一些特殊模块的日志。MongoDB中有一个全局的LogDomain用于普通的日志输出,另外还有一个专门用于JavaScript输出。每个LogDomain管理了一组Appender,因此可以实现比较灵活的配置,比如系统日志可以输出到一个文件,JavsScript相关的日志可以输出到console或是另一个文件。除Appender的管理方法(attachAppender()、detachAppender()、clearAppenders())外,LogDomain也提供一个append()方法,调用后就是遍历其包含的Appender依次调用append()方法。

LogManager

LogDomain的管理者,包含一个全局的LogDomain以及一个LogDomain map,可以根据LogDomain的名字获取到对应的LogDomain。

LogComponent

标识日志是哪个组件产生的,是一个枚举值,有

  • kDefault
  • kControl
  • kCommand
  • ...

如果没有明确的所属组件,那么使用kDefault这个默认组件。

LogSeverity

日志级别,按照严重程度包含以下级别:

  • Severe
  • Error
  • Warning
  • Info
  • Log
  • Debug(1)
  • Debug(2)

各级别有一个对应的整型值,从小到大依次对应-4到2。当一个log调用时使用的日志级别对应的整型值大于当前配置的日志级别的整型值时,这个log才会被记录。可以在YAML配置文件中使用systemLog.verbosity来配置日志级别,注意这个配置只能配置非负值,即0、1、2分别对应Log、Debug(1)和Debug(2)。因此,值为负数的日志,即Info级别以上的的日志是一定会被记录的。另外,MongoDB可以支持不同的LogComponent使用不同的LogSeverity,比如可以配置systemLog.component.control.verbosity等。

LogstreamBuilder

根据提供的LogDomain、的LogSeverity和LogComponent等封装一个日志流,包含一个std::ostringstream。它重载了『<<』操作符,将日志内容输入到std::ostringstream中去,因此可以直接按照std::ostringstream的使用方式去使用。在LogstreamBuilder析构时会调用LogDomain的append()方法将日志输出到Appender中。

如何使用

MongoDB启动时在GlobalLogManager这个全局初始化函数中实例化了全局的LogManager单例,其中包含了ComponentMessageLogDomain这个全局的LogDomain。因此我们只只需要在需要记log的地方构造LogstreamBuilder,再传入日志内容就可以了。

在util/log.h中定义了以下函数直接构造一个对应的LogstreamBuilder(使用全局的LogDomain和MONGO_LOG_DEFAULT_COMPONENT):

  • severe()
  • error()
  • warning()
  • log()

此外,还定义了以下一系列LOG宏来根据传入的DLEVEL值是否大于组件配置的日志级别的值来判断是否需要记录log:

  • LOG
  • MONGO_LOG(DLEVEL)
  • MONGO_LOG_COMPONENT(DLEVEL, COMPONENT1)
  • MONGO_LOG_COMPONENT2(DLEVEL, COMPONENT1, COMPONENT2)
  • MONGO_LOG_COMPONENT3(DLEVEL, COMPONENT1, COMPONENT2, COMPONENT3)

这种方式可以指定DLEVEL,因此更加灵活。

综上,MongoDB日志系统的使用非常简单,只需:

  1. 在cpp文件中include util/log.h头文件,注意不可include多次
  2. 在当前cpp文件中定义一个MONGO_LOG_DEFAULT_COMPONENT宏
  3. 使用预定义的几个函数或LOG系列宏来进行log调用
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
4月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
80 0
|
23天前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
23 2
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
52 1
|
2月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
48 3
|
2月前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
37 4
|
2月前
|
运维 NoSQL BI
简道云搭载阿里云MongoDB数据库,帮助数以万计企业重构业务系统
通过与MongoDB和阿里云团队的合作,让简道云少走了弯路,保障了线上服务的长期稳定运行,提高了吞吐效率,并相应降低了线上运行成本
|
4月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
131 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
59 0
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
42 0

相关产品

  • 云数据库 MongoDB 版