Nodejs使用winston进行日志记录详解

 更新时间:2024年01月15日 11:02:11   作者:东方小月  
在生产环境中,更常见的做法是使用专门的日志记录库,如winston、log4js等,来实现更灵活和可配置的日志记录功能,本篇文章将介绍的是winston的强大的日志记录功能,快跟随小编一起学习一下吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在我们开发过程中,日志记录是非常重要的一环,它可以提供我们程序的运行状况、错误和异常、性能和安全等方面的关键信息,让开发人员和运维团队更好地管理和维护应用程序。

那么在NodeJS中该如何进行日志记录呢? 有小伙伴就会说console.log! 确实,Node.js中可以使用console.log进行简单的日志记录,但是它将信息输出到控制台就结束了,不会被持久化保存到文件或其他存储设备中。所以通常只是在开发和调试阶段使用一下。

在生产环境中,更常见的做法是使用专门的日志记录库,如winstonlog4js等,来实现更灵活和可配置的日志记录功能。本篇文章将介绍的是winston的强大的日志记录功能。下面我们就从一个简单的node项目开始吧!

初始化项目

新建目录执行

npm init

初始化一个 node 项目。

然后在 package.json 文件中新增type:module字段,这样我们就可以使用 ES6 语法了

{
  "name": "winston",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

新建一个index.js文件。ok,接下来我们就可以使用 winston 了

安装使用 winston

执行命令npm i winston -S安装winston,安装完成我们就可以在程序中导入使用了

比如在index.js中我们可以使用 winston.createLogger 创建一个日志记录器

import winston from "winston";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [new transports.Console()],
});

logger.info("cxkhtw");

然后我们执行node index.js就会看到控制台打印了

info: cxkhtw

日志记录器接受以下参数:

名称默认值描述
level'info'仅在 info.level 小于或等于此级别时记录
levelswinston.config.npm.levels表示日志优先级的级别(和颜色)
formatwinston.format.json用于 info 消息的格式化(参见:Formats)
transports[]日志传传输方式
exitOnErrortrue如果为 false,则处理的异常不会导致进程退出
exceptionHandlers[]未捕获异常处理方式
silentfalse如果为 true,则所有日志都将被禁止

我们简单看下上面常用的参数

level

它表示日志记录的最低等级,在 winston 中,日志级别遵循 RFC5424 指定的严重性顺序:所有级别的严重性被规定为从最重要到最不重要的数字递增。

const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6,
};

比如上面我们指定的 level 为 debug,那么 debug 及以上都会被记录,下面的则不会被打印,比如我们加几种打印类型

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.silly("cxkhtw");

执行程序后会发现只记录了前三个

format

format可以规定日志的格式,默认是format.json也就是 JSON 格式,比如我们将format去掉再执行程序

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

你会发现打印出来的变成 JSON 格式了

我们还可以使用format.combine组合我们需要的格式

format: format.combine(format.timestamp(), format.simple()),

更多格式可以参见formats

transports

transports可以理解为日志的传输方式,比如我们想传输到控制台,文件,数据库,接口等等,都可以选择对应transports,比如上面的new transports.Console()就可以让我们在控制台看到打印的日志。

1. transports.File

如果我们想将日志记录在文件中,可以使用new transports.File进行配置

const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.File({
      dirname: "logs",
      filename: "index.log",
    }),
  ],
});

这时候再执行程序你就会发现多了个 logs/index.log 文件并且记录了打印的日志

如果将所有日志都记录在一个文件中,那这个文件岂不是越来越大? 不用担心。winston还给我们提供了日志分割的功能,只需要配置maxsize属性即可,单位是字节,为了更好的演示这里我们设置 1024 字节也就是 1kb

const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.File({
      dirname: "logs",
      filename: "index.log",
      maxsize: 1024,
    }),
  ],
});

然后多执行几次就会发现日志文件新增了一个,并且第一个日志文件大小刚好 1kb 左右

一般来说我们进行日志分割都是根据时间来分割的,这样方便后期排查问题,那么winston支持按时间分割吗? 答案是肯定的

2. transports.DailyRotateFile

如果想根据时间分割日志,我们需要换别的 Transport ,winston提供了很多transport,感兴趣的可以点进去看下。我们这里使用DailyRotateFile来分割日志

我们首先要安装npm install winston-daily-rotate-file -S,然后导入就可以使用了

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.DailyRotateFile({
      level: "debug",
      dirname: "logs",
      filename: "index-%DATE%.log",
      datePattern: "YYYY-MM-DD-HH-mm",
      maxSize: 1024,
    }),
  ],
});

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.info("cxkhtw");

这时候每分钟的日志都会被记录在不同的文件中了,当然你可以设置datePattern来规定这个时间

3. transports.Http

有的时候我们想将日志上报到指定接口中进行记录 winston 也是支持的,可以使用内置的 transport.Http 进行配置,为了更好的演示,我们用express写一个简单的接口,安装express后新建一个 server.js

import express from "express";
import bodyParser from "body-parser";
const app = express();
const port = 3000;
app.use(bodyParser.json());
// 定义一个 POST请求的路由
app.post("/", (req, res) => {
  console.log(req.body);
  res.send("Hello, World!");
});

// 启动服务器
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

注意这里还需要安装body-parser让我们的接口可以接收 JSON 文件,然后新建一个终端执行node server.js启动一个端口为 3000 的接口

在我们程序中的transports添加一个transports.Http,并传入一些配置参数

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [
    new transports.Console(),
    new transports.Http({
      level: "info",
      host: "localhost",
      port: 3000,
      path: "/",
    }),
  ],
});

logger.info("cxkhtw");
logger.debug("cxkhtw");
logger.warn("cxkhtw");
logger.info("cxkhtw");

然后执行一下,可以发现我们接口中拿到了日志信息,后面可以根据自己的需求将这些信息存储下来

winston的transport还有很多,由于篇幅有限这里先只介绍这几个常用的,感兴趣的可以自己查看

exceptionHandlers

除了上述功能外,winston 还可以配置处理未捕获异常,如下

import winston from "winston";
import "winston-daily-rotate-file";
const { format, transports } = winston;
const logger = winston.createLogger({
  level: "debug",
  format: format.simple(),
  transports: [new transports.Console()],
  exceptionHandlers: [
    new transports.File({
      dirname: "errorlogs",
      filename: "error.log",
    }),
  ],
});
throw Error("这是一条错误信息");

运行就会发现多了一个errorlogs/error.log文件

总结

本篇文章介绍 winston 一些常见用法,包括 level 的优先级、日志打印的格式format以及一些transport的使用等等。

其中,重点介绍了transport的用法,通过transport实现了生成日志文件,日志分割,日志上传接口等常见日志处理功能。

到此这篇关于Nodejs使用winston进行日志记录详解的文章就介绍到这了,更多相关Nodejs winston内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

您可能感兴趣的文章:

相关文章

  • 基于npm?install或run时一些报错的解决方案

    基于npm?install或run时一些报错的解决方案

    这篇文章主要介绍了基于npm?install或run时一些报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Node.js 阻塞与非阻塞的实现

    Node.js 阻塞与非阻塞的实现

    本文主要介绍了Node.js中阻塞和非阻塞调用之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 利用node+koa+axios实现图片上传和回显功能

    利用node+koa+axios实现图片上传和回显功能

    这篇文章为大家详细介绍了如何利用node+koa+axios实现图片上传和回显功能,主要实现简单的图片上传和静态内容的访问,感兴趣的可以了解一下
    2022-05-05
  • NodeJS读取分析Nginx错误日志的方法

    NodeJS读取分析Nginx错误日志的方法

    这篇文章主要介绍了NodeJS读取分析Nginx错误日志的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Node.js?中常用内置模块(path?路径模块)

    Node.js?中常用内置模块(path?路径模块)

    这篇文章主要介绍了Node.js?中常用内置模块(path?路径模块),文章围绕主题展开详细的相关介绍,具有一定的参考价值,感兴趣的朋友可以参考一下
    2022-09-09
  • Node.js?queryString?解析和格式化网址查询字符串工具使用

    Node.js?queryString?解析和格式化网址查询字符串工具使用

    这篇文章主要为大家介绍了Node.js?queryString?解析和格式化网址查询字符串工具使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 使用 Node.js 开发资讯爬虫流程

    使用 Node.js 开发资讯爬虫流程

    这篇文章主要介绍了使用 Node.js 开发资讯爬虫流程,爬虫流程概括下来就是把目标网站的HTML下载到本地再进行数据提取。具体内容详情大家参考下本文
    2018-01-01
  • node自定义安装更改npm全局模块默认安装路径的步骤

    node自定义安装更改npm全局模块默认安装路径的步骤

    有段时间没用npm了,新建个项目,需要改变npm全局包默认安装的路径,本文就来介绍一下node自定义安装更改npm全局模块默认安装路径的步骤,感兴趣的可以了解下
    2021-09-09
  • Node.js基础入门之模块与npm包管理器使用详解

    Node.js基础入门之模块与npm包管理器使用详解

    Node.js是一个基于Chrome?V8引擎的JavaScript运行时。类似于Java中的JRE,.Net中的CLR。本文将详细为大家介绍Node.js中的模块与npm包管理器的使用,需要的可以参考一下
    2022-03-03
  • Node.js实现数据推送

    Node.js实现数据推送

    这篇文章主要为大家详细介绍了Node.js实现数据推送的相关资料,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论

?


http://www.vxiaotou.com