发布网友 发布时间:2024-10-21 14:23
共1个回答
热心网友 时间:3分钟前
前面在《Node.js日志最佳实践指南》介绍了关于日志的最佳实现指南,本文将使用Winston库来构建一个简单的日志功能。
Winston是强大、灵活的Node.js开源日志库之一,理论上,Winston是一个可以记录所有信息的记录器。这是一个高度直观的工具,易于定制。可以通过更改几行代码来调整其背后的逻辑。它使对数据库或文件等持久存储位置的日志记录变得简单容易。
Winston提供以下功能:
集中控制日志记录的方式和时间:在一个地方更改代码即可
控制日志发送的位置:将日志同步保存到多个目的地(如Elasticsearch、MongoDB、Postgres等)。
自定义日志格式:带有时间戳、颜色日志级别、JSON格式等前缀。
winston实践实践代码将在项目pretender-service中增加日志功能,安装依赖:
npminstallwinston--save接下来需要初始化logger,由于项目中已经存在一个logger.js文件,这里再创建一个winstonLogger.js,代码如下:
const{createLogger,format,transports}=require("winston");module.exports=createLogger({transports:[newtransports.File({filename:"logs/server.log",level:"info",format:format.combine(format.timestamp({format:"MMM-DD-YYYYHH:mm:ss"}),format.align(),format.printf((info)=>`${info.level}:${[info.timestamp]}:${info.message}`)),}),],});通过调用winston库中的createLogger函数来初始化记录器。在transports对象中,可以提供一个文件名将日志存储在文件中。默认情况下,日志记录未格式化并打印为带有两个参数的JSON字符串,日志消息和等级。
下面对之前的logger进行修改,将winston日志记录器加入进去,具体修改方式参阅代码,下面给出其使用方法:
constwinlogger=require("./winstonLogger");winlogger.info("日志内容");执行程序后可以会在根目录生成相应的日志文件logs/server.log
也可以更改日志级别,修改logger,只在console.error方式下使用winston:
记录了数据库连接错误信息,上面的信息仅只是为了演示。
多transportswinston允许设置多种transport,在winstonLogger.js中更改createLogger函数如下:
const{createLogger,format,transports}=require("winston");module.exports=createLogger({format:format.combine(format.timestamp({format:"MMM-DD-YYYYHH:mm:ss"}),format.align(),format.printf((i)=>`${i.level}:${[i.timestamp]}:${i.message}`)),transports:[newtransports.File({filename:"logs/info.log",level:"info",format:format.combine(format.printf((i)=>i.level==="info"?`${i.level}:${i.timestamp}${i.message}`:"")),}),newtransports.File({filename:"logs/error.log",level:"error",}),],});再次执行程序,将会看到error.log和info.log文件,由于在logger中未设置info,因此info.log的内容为空,error.log内容和上面的一样。
多loggerswinston允许设置多个logger,在实际项目中可以为每个模块创建一个记录器logger,如下代码,创建一个用户日志记录器和登录验证记录器:
const{createLogger,format,transports}=require("winston");constcustomFormat=format.combine(format.timestamp({format:"MMM-DD-YYYYHH:mm:ss"}),format.align(),format.printf((i)=>`${i.level}:${[i.timestamp]}:${i.message}`));constglobalLogger=createLogger({format:customFormat,transports:[newtransports.File({filename:"logs/info.log",level:"info",format:format.combine(format.printf((i)=>i.level==="info"?`${i.level}:${i.timestamp}${i.message}`:"")),}),newtransports.File({filename:"logs/error.log",level:"error",}),],});constauthLogger=createLogger({transports:[newtransports.File({filename:"logs/authLog.log",format:customFormat,}),],});module.exports={globalLogger:globalLogger,authLogger:authLogger,};修改后代码创建了一个全局记录器globalLogger和一个鉴权记录器authLogger,对应修改logger.js:
const{globalLogger}=require("./winstonLogger");globalLogger.error(message);每日滚动日志文件正如前面介绍的最佳实践中提到的,按照特定的条件对日志文件进行分割,通常按照日期、大小进行分割,并设置保存的日志天数。为实现这些需求,要有一个安装一个Winston相关的依赖库。
npminstallwinston-daily-rotate-file--save安装完成后使用以下代码更新到winstonLogger.js文件:
const{createLogger,format,transports}=require("winston");require("winston-daily-rotate-file");constcustomFormat=format.combine(format.timestamp({format:"MMM-DD-YYYYHH:mm:ss"}),format.align(),format.printf((i)=>`${i.level}:${[i.timestamp]}:${i.message}`));constdefaultOptions={format:customFormat,datePattern:"YYYY-MM-DD",zippedArchive:true,maxSize:"20m",maxFiles:"14d",};constglobalLogger=createLogger({format:customFormat,transports:[newtransports.DailyRotateFile({filename:"logs/info-%DATE%.log",level:"info",...defaultOptions,}),newtransports.DailyRotateFile({filename:"logs/error-%DATE%.log",level:"error",...defaultOptions,}),],});constauthLogger=createLogger({transports:[newtransports.DailyRotateFile({filename:"logs/authLog-%DATE%.log",...defaultOptions,}),],});module.exports={globalLogger:globalLogger,authLogger:authLogger,};运行项目,可以看到日志文件:
至此,Winston的基本使用指南介绍完了,以上这些基本可以满足日常项目的需要了。