MongoDB中的日志系统

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 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调用
目录
相关文章
|
21天前
|
Prometheus 监控 Cloud Native
基于docker搭建监控系统&日志收集
Prometheus 是一款由 SoundCloud 开发的开源监控报警系统及时序数据库(TSDB),支持多维数据模型和灵活查询语言,适用于大规模集群监控。它通过 HTTP 拉取数据,支持服务发现、多种图表展示(如 Grafana),并可结合 Loki 实现日志聚合。本文介绍其架构、部署及与 Docker 集成的监控方案。
230 122
基于docker搭建监控系统&日志收集
WGLOG日志管理系统是怎么收集日志的
WGLOG通过部署Agent客户端采集日志,Agent持续收集指定日志文件并上报Server,Server负责展示与分析。Agent与Server需保持相同版本。官网下载地址:www.wgstart.com
|
3月前
|
监控 API 开发工具
HarmonyOS Next的HiLog日志系统完全指南:从入门到精通
本文深入解析HarmonyOS Next的HiLog日志系统,涵盖日志级别、核心API、隐私保护与高级回调功能,助你从入门到精通掌握这一重要开发工具。
206 1
|
10天前
|
Ubuntu
在Ubuntu系统上设置syslog日志轮替与大小限制
请注意,在修改任何系统级别配置之前,请务必备份相应得原始档案并理解每项变更可能带来得影响。
51 2
|
2月前
|
存储
WGLOG日志管理系统可以采集网络设备的日志吗
WGLOG日志审计系统提供开放接口,支持外部获取日志内容后发送至该接口,实现日志的存储与分析。详情请访问:https://www.wgstart.com/wglog/docs9.html
|
7月前
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
2524 70
Grafana Loki,轻量级日志系统
|
6月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
271 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
6月前
|
存储 JSON Go
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
113 10
|
6月前
|
存储 NoSQL Linux
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
427 0
|
存储 监控 安全
5款 Syslog集中系统日志常用工具对比推荐
集中管理Syslog有助于持续监控网络中的恶意活动,确保日志的搜索和分析更为便捷。常用工具包括Rsyslog、Syslog-ng、Logstash和Fluentd,它们各有优劣。Rsyslog通过多种协议确保日志传输的安全性;Syslog-ng支持高效收集和转发日志;Logstash能解析多源日志并索引;Fluentd将日志转换为JSON格式。卓豪EventLog Analyzer则提供一体化的日志管理,支持日志分析、报表生成、用户行为分析及实时告警,是全面的日志管理解决方案。

相关产品

  • 云数据库 MongoDB 版
  • 推荐镜像

    更多