Nodejs使用winston进行日志记录详解
在我们开发过程中,日志记录是非常重要的一环,它可以提供我们程序的运行状况、错误和异常、性能和安全等方面的关键信息,让开发人员和运维团队更好地管理和维护应用程序。
那么在NodeJS中该如何进行日志记录呢? 有小伙伴就会说console.log
! 确实,Node.js中可以使用console.log
进行简单的日志记录,但是它将信息输出到控制台就结束了,不会被持久化保存到文件或其他存储设备中。所以通常只是在开发和调试阶段使用一下。
在生产环境中,更常见的做法是使用专门的日志记录库,如winston
、log4js
等,来实现更灵活和可配置的日志记录功能。本篇文章将介绍的是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 小于或等于此级别时记录 |
levels | winston.config.npm.levels | 表示日志优先级的级别(和颜色) |
format | winston.format.json | 用于 info 消息的格式化(参见:Formats) |
transports | [] | 日志传传输方式 |
exitOnError | true | 如果为 false,则处理的异常不会导致进程退出 |
exceptionHandlers | [] | 未捕获异常处理方式 |
silent | false | 如果为 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解如何使用Node.js编写命令工具——以vue-cli为例
本篇文章主要介绍了如何使用Node.js编写命令工具——以vue-cli为例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-06-06详解NodeJs项目 CentOs linux服务器线上部署
这篇文章主要介绍了NodeJs项目 CentOs linux服务器线上部署,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-09-09node.js实现http服务器与浏览器之间的内容缓存操作示例
这篇文章主要介绍了node.js实现http服务器与浏览器之间的内容缓存操作,结合实例形式分析了node.js http服务器与浏览器之间的内容缓存原理与具体实现技巧,需要的朋友可以参考下2020-02-02
最新评论