系统日志

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
日志服务 SLS,月写入数据量 50GB 1个月
简介: 系统日志

目的

NestJS 自带了 Logger 模块,这个模块可以将内容打印到控制台,也可以将内容持久化到文件中。这种设计符合主流的日志文件的方案,但是实践下来发现其有非常多的限制。


  1. node是一个单主线程的环境,线上单台服务器一般都会使用PM2多开服务,更不用提集群部署了。这样就会造成日志零散的问题。出了问题,不知道日志会写入到那个实例中,只能将所有的日志文件都查看一遍,运气好,一下就找到,运气不好那就呵呵了。
  2. 写入文件的形式在docker容器环境下要注意将日志文件挂载到volume中进行持久化,否则一旦容器重启岂不是日志都丢了。
  3. 日志文件文件一般未被压缩,会占用比较大的空间,所以都会定期清理。如果不做特殊操作,清理起来还是很麻烦的。
  4. 日志文件一般很难查看,查找分类等功能都比较欠缺。也就是vim、记事本等有的功能可以拿来使用。想要使用统计分析结果那就呵呵了。


基于以上限制,我们的日志系统要做到易于查看,易于管理,易于统计分析,精准快速定位问题点


设计

不采用文件的形式很容易就想到了数据库存储,存储日志,当然是文档型数据库更加合适,文档型数据库首推 MongoDB ,因此,我们采用 MongoDB 来存储系统日志。这样在查询的时候借助 MongoDB 提供的查询方式可以做到很大的灵活度。


对于不同的部署方式也要有单独的考量。单体、集群、微服务的方式都会产生略微的差异。


单体服务

单体服务最为容易,只需要在产生日志的时候将日志信息写入数据库即可,这里的写入也没有什么需要特殊处理的。


可以考虑一个小优化,将一段时间内的日志聚合到一起,批量通过 insert 来插入到 MongoDB 数据库中。


集群服务

多开集群的日志在本质上和单体没有太大差别,因此完全可以使用单体那套方案。


这里需要考虑一点,要考虑系统日志的产生情况,如果产生的速度很快,还没有设计批量落盘,就有可能造成数据库同时写入请求太多的情况,影响数据库性能。


也可以更进一步的优化,将日志收集到集群的某一个服务上,由这个服务统一将数据落盘,具体操作详见下面的微服务方式。


微服务

微服务是将单体服务拆成多个更细粒度的服务进行部署,各个服务之间独立运行(当然,也可以独立多开、集群),这样就会导致每个服务都产生日志。如果每个服务都采用和数据库直连的方式,就会造成数据库连接数量过多,而且代码量也相应的增加很多(主要是指重复的代码)。如果修改表结构的话,那对于 code first 方案更是一种灾难(我们使用的都是 code first 方式)。


基于这些方面考虑,我们采用队列的方式来将数据收集到同一个服务上,并进行数据落盘操作。


队列可以采用 Kafka 这样的成熟消息队列,其性能和稳定性毋庸置疑,并且其生产消费的控制方案非常强大,给到我们控制的最高灵活度。但是缺点就是很重,在 Kafka 3.x 版本之前都是需要借助 Zookeeper 的,在 Kafka 3.x 之后不需要 Zookeeper 了,但是也很重。仅仅为了一个日志而引入这么庞大的东西是不划算的。当然,如果系统中本来就有 Kafka 的需求,那么在这种环境下就很舒服了。


NestJS 也提供了一套轻量级的队列方案,参考官方文档——Queues,这套方案使用了bull软件包,借助 Redis发布订阅功能实现了消息队列的核心。我们的每个项目基本上 Redis 就是必备,因此使用此方案就很容易了。

目录
相关文章
|
4月前
|
运维 安全 Linux
【揭秘】如何轻松掌控Linux系统命脉?——一场探索日志文件奥秘的旅程,带你洞悉系统背后的故事!
【8月更文挑战第21天】日志文件对Linux系统至关重要,记录着包括应用行为、组件状态和安全事件在内的系统活动,如同系统的“黑匣子”。掌握日志查看技巧是系统管理的基础技能,有助于快速诊断问题。常用命令包括`cat`、`tail`和`grep`等,可用于查看如`/var/log/messages`和`/var/log/auth.log`等系统日志文件,以及特定应用的日志。`journalctl`则用于查看systemd服务日志。此外,`logrotate`工具可管理日志文件的滚动和归档,确保系统高效运行。
48 4
|
4月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
77 0
|
22天前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
21 2
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
48 1
|
2月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
46 3
|
2月前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
36 4
|
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系统命令与网络,磁盘和日志监控总结
58 0
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
41 0