Node输出日志的正确姿势

news2024/11/23 12:09:21

背景

每个程序员都喜欢在有问题的代码中插入一些日志的方法来帮助调试程序,比如System.out.println或console.log。解决后,就会将这些语句删除,周而复始。
但是通过系统日志输出的日志格式都是这种:

// output
console.log("log"); // log
console.info("message"); // message
console.warn("Warning");// warning

现在想象一下,如果你在后端排查问题时,你有数百条这样的信息。这样的日志不仅很难知道消息级别或消息记录的日期,而且过滤和排查日志也是一项艰巨的任务。
我们排查问题时,更期望看到这样的日志:

{"level":"error","message":"Error message","timestamp":"2022-09-20T11:39:33.953Z"}

{"level":"warn","message":"Warning message","timestamp":"2022-09-20T11:39:33.957Z"}

{"level":"info","message":"Info message","timestamp":"2022-09-20T11:39:33.957Z"}

日志API就是为了解决这个问题而设计的。日志API的优点:
● 可以很容易地取消全部日志记录,或者仅仅取消某个级别以下的日志,而且可以很容易地再次打开日志开关。
● 可以很简单的禁止日志记录,因此,将这些日志代码留在程序中的开销很小。
● 日志记录可以被定向到不同的处理器,如在控制台、文件等等。
● 日志记录器和处理器都可以记录进行过滤,过滤器可以根据过滤器实现指定的标准丢弃那些无用的记录。
● 日志记录可以采用不同的方式格式化,例如:纯文本或JSON。
● 应用程序可以使用多个日志记录器。
● 日志系统的配置由配置文件控制。
在 Node.js 应用中进行日志记录是非常重要的,因为它可以帮助我们跟踪应用程序中的问题和错误。接下来介绍 一下Node.js 的日志记录技术。

使用 Winston 进行日志记录

Winston是一个流行的、功能丰富的、灵活的Node.js日志库。它使用的默认格式是JSON,但可以配置向多个存储设备中发送日志,目前每周下载量接近1千万。

安装和使用 Winston

要使用 Winston,首先需要安装它。可以使用 npm 安装 Winston:

npm install winston

安装完成后,在应用程序中引入 Winston:

const winston = require('winston');
// 现在可以创建一个 Winston 实例,并开始记录日志。以下是一个示例:
const winston = require('winston');
const logger = winston.createLogger({   
  level: 'info',   
  format: winston.format.json(),   
  transports: [     
    new winston.transports.Console(),     
    new winston.transports.File({ 
      filename: 'error.log', 
      level: 'error' 
    })  
  ]
}); 
logger.info('Hello, world!');

在上面的示例中,创建了一个名为 logger 的 Winston 实例。指定了日志级别为 info,表示只记录等级为 info 或更高的日志消息。我们还指定了一个 json 格式化器,以便记录格式化的 JSON 日志消息。定义了两个传输器,一个将日志消息记录到控制台,另一个将错误日志消息记录到名为 error.log 的文件中。

Winston 的日志级别

Winston 支持多个日志级别,可以根据日志消息的严重程度选择不同的日志级别来记录。Winston 的日志级别从高到低分别为:
● error:表示发生了错误
● warn:表示警告性的信息
● info:表示常规信息
● verbose:表示详细信息
● debug:表示调试信息
● silly:表示无关紧要的信息

Winston 的格式化器

Winston 的格式化器可以帮助我们格式化日志消息,以便更好地组织和分析日志数据。Winston 提供了多个内置的格式化器,例如 json、simple、prettyPrint 等。我们也可以自定义格式化器,根据自己的需求来记录日志数据。
以下是一个使用 json 格式化器记录日志的示例:

const winston = require('winston'); 
const logger = winston.createLogger({   
  level: 'info',   
  format: winston.format.json(),   
  transports: [new winston.transports.Console()] 
}); 
logger.info({ message: 'Hello, world!', user: 'Alice' });

Winston 的传输器

Winston 支持多个传输器,可以将日志消息记录到不同的目标中,例如控制台、文件、数据库、syslog 等。以下是一个将日志消息记录到文件中的示例:

const winston = require('winston'); 
const logger = winston.createLogger({   
  level: 'info',   
  format: winston.format.simple(),   
  transports: [
    new winston.transports.File({ filename: 'app.log' })
  ] 
}); 
logger.info('Hello, world!');

在上面的示例中,我们使用 File 传输器将日志消息记录到名为 app.log 的文件中。我们设置日志级别为 info,只记录等级为 info 或更高的日志消息。
除了输出到文件中,Winston还支持输出控制台、http请求以及流的方式。


我们也可以自定义输出的方式,比如输出到邮件、通过接口消息通知等等。

Winston的实践

在实际使用过程中,我比较喜欢将console.log进行一次封装。将 console.log 绑定到 logger.info 方法。每次调用 console.log 时,实际上是在调用 logger.info 方法。因此,日志消息将通过Winston的Console传输器发送到标准控制台中和文件中。

const winston = require('winston');

const logger = winston.createLogger({
  transports: [
    new winston.transports.Console(),
    new winston.transports.File()
  ]
});

// 将 console.log 绑定到 logger.info 方法
console.log = logger.info.bind(logger); 
// 使用 console.log 记录日志消息
console.log('Hello, Winston!');
console.log('This is a log message.');
 
// error 也可以绑定到logger上,但是建议输出file时,指定新的文件名,方便后续的日志查看。
console.error = logger.error.bind(logger);

如果不在需要日志记录时,可以直接设置level为off,就可以停止日志的记录。

接入es

日志输出和日志格式解决之后,为了方便检索和更快的排查问题,可以将日志接入es。
下面是接入es后,通过kibana查看的结果:


将日志接入 Elasticsearch (ES) 的好处:

  1. 快速检索和分析:ES 是一种基于搜索引擎的分布式数据存储和分析引擎,它提供了一种高效的方式来存储和搜索大量的结构化和非结构化数据。通过将日志接入 ES,我们可以使用 ES 强大的搜索和聚合功能来快速检索和分析日志数据。
  2. 实时监控:ES 支持实时数据索引和搜索,因此可以实时监控应用程序和系统的状态和性能。通过将日志接入 ES,我们可以实时监控应用程序和系统的日志,并在出现异常或错误时立即采取行动。
  3. 可视化和报告:ES 提供了一种灵活和强大的可视化和报告工具,可以将日志数据可视化为图表、仪表板和报告等形式。通过将日志接入 ES,我们可以使用这些工具来生成可视化报告,并帮助我们更好地理解和优化应用程序和系统的性能。

注意事项

● 日志级别,不要都使用info来使用,要区分不同的日志级别。
● 日志的打印方式:同步和异步。
● 日志体量的大小:LOG系统就是直接写磁盘文件,既然写磁盘文件就牵扯到磁盘IO,而磁盘IO跟内存读写有一个数量级的性能差别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TensoRF-张量辐射场论文笔记

TensoRF-张量辐射场论文笔记_什度学习的博客-CSDN博客 注释代码: https://github.com/xunull/read-TensoRF 官方源码:https://github.com/apchenstu/TensoRF Install environment conda create -n TensoRF python3.8 conda activate TensoRF pip install torch t…

HTTPTomcatServlet学习

HTTP&Tomcat 今日目标: 了解JavaWeb开发的技术栈理解HTTP协议和HTTP请求与响应数据的格式掌握Tomcat的使用掌握在IDEA中使用Tomcat插件理解Servlet的执行流程和生命周期掌握Servlet的使用和相关配置 1. Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&…

正点原子串口算法解析-定时器+数组长度判断

源码 片段1 片段2 片段3 解析 片段1的作用 开启一个10ms的定时器 片段2的作用 每10毫秒置位接收标志位且关闭定时器 片段3的作用和详解 代码第38行 用res变量接收数据 从代码第39行开始看 接收标志位不允许接收(不为0) 下面的所有代码都不会运行 如果接收标志为允许接收…

CRM管理系统如何选型?分别有什么作用?

CRM管理系统通常指CRM系统,中文名称是客户关系管理,起源于上世纪80年代的“接触管理”,它能确保客户在销售、营销、服务上的每一步交互都顺利高效,带动业绩的提升。今天就来说一说CRM管理系统是什么(从使用到选型&…

【HarmonyOS】元服务混淆打包以及反混淆mapping文件生成

大家所知的Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现;另一部分是资源压缩,从而可以减少包体积。 一般应用release发布的时候都会选择开启混淆,防止应用被反编译…

OpenPCDet系列 | 5.4.3 DenseHead中的AxisAlignedTargetAssigner正负样本分配模块

文章目录 AxisAlignedTargetAssigner模块assign_targets处理流程1. 提取有效gt信息2. 提取需要处理的类别信息3. 帧信息整合4. 批信息整合 assign_targets_single处理流程1. 构建每个anchor的正负样本label分配2. 构建每个anchor的正负样本编码信息bbox_targets分配3. 构建每个…

NMEA 2000总线连接器组成类别及功能

NMEA 2000总线介绍 连接的所有设备都能彼此通信 NMEA 2000总线系统是一种数字网络,可连接船上各种系统和设备,例如雷达、GPS、深度传感器、气象环境和船体控制系统。 NMEA 2000总线的工作方式 NMEA 2000总线通过总线连接器连接各个设备和系统&#xf…

HANTS时间序列滤波算法的MATLAB实现

本文介绍在MATLAB中,实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补的详细方法。 HANTS(Harmonic Analysis of Time Series)是一种用于时间序列分析和插值的算法。它基于谐波分析原理&#x…

linux 常用命令awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法:awk pattern {action} files 1.RS, ORS, F…

CFS三层内网靶机渗透

目录 一、靶场框架 靶场搭建: 二、渗透过程 三、总结 靶场介绍: 三层内网靶场,共有三个网段,分别为75网段(公网网段)、22网段(内网)、33网段(内网) 靶…

ChatGPT+ “剪映 or 百度AIGC” 快速生成短视频

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 ChatGPT快速生成短视频 文章目录 🍐1.ChatGPT 剪映🍏2.ChatGPT 百度AIGC平台&#x…

【ThinkPHP6系列学习-2】多应用模式配置

上一篇:【ThinkPHP6系列学习-1】下载并部署ThinkPHP6 这里写一写TP6下配置多应用。因为TP6和TP5有所差异,TP6默认是单应用模式(单模块),而我们实际项目中往往是多应用的(多个模块)&#xff0c…

1.Buffer_Overflow-2.Stack_Overflow / 写入字符串

这道题虽然简单 但是却给我了另一个解题的看法 我们先进行运行 我们看看保护 发现只有NX保护 反汇编看看 发现有shellcode 但是我们没有办法执行shellcode 因为v5 不会等于后面的 这里我原本没有想法 后面进行看看他的汇编 这里其实就很清楚了 .text:00000000004011BB …

( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

题目一&#xff08;贪心&#xff09; ❓674. 最长连续递增序列 难度&#xff1a;简单 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定…

vcruntime140.dll如何修复?这个修复方法很简单,适合电脑小白

今天打开photoshop软件工作的时候&#xff0c;突然间就打不开&#xff0c;电脑报错由于找不到vcruntime140.dll&#xff0c;无法继续执行此代码&#xff0c;然后我就把photoshop卸载了&#xff0c;再重新安装&#xff0c;依然还是报错。这个可怎么办&#xff1f;vcruntime140.d…

CentOS 安装MongoDB 6.0

一、安装依赖 yum install libcurl openssl xz-libs 二、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 选择RedHat / CentOS 7.0平台的原因是我的操作系统使用的是CentOS 7.0的&#xff0c;需要下载与操作系统匹配的安装包 三、…

ChatGPT插件权限给Plus用户放开了

大家好&#xff0c;我是章北海mlpy ChatGPT插件权限给Plus用户放开了 我稍微测试了俩&#xff0c;感觉还行&#xff0c;后续我会对一些热门插件深入测测&#xff0c;敬请期待。 官方对插件的介绍如下&#xff1a; 1、插件由非由OpenAI控制的第三方应用程序提供动力。在安装…

Spring Cloud Alibaba-Sentinel熔断降级

Sentinel: 轻量级的流量控制、熔断降级Java库&#xff0c; 分布式系统的流量防卫兵。 文章目录 一、Sentinel 是什么&#xff1f;二、安装Sentinel控制台三、Sentinel 实战3.1、准备工作3.2、流控规则快速失败Warm Up匀速排队 3.3、热点key限流3.4、降级规则3.5、系统规则 四、…

自定义组件3-behaviors

1、behaviors是小程序中用于实现组件间代码共享的特性&#xff0c;类似于Vue.js中的mixins 2、behaviors的工作方式 每个behaviors可以包含一组属性、数据、生命周期函数和方法。组件引用它时&#xff0c;它的数据和属性和方法会被 合并到组件中。 每个组件可以引用多个behav…

Python采集知某专栏文章保存成pdf

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm wkhtmltopdf 软件 文末名片获取 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip install parsel 数据解析 re >>> 内置模块 不…