• 技术文章 >web前端 >js教程

    浅析Node.js+Winston库如何构建简单日志功能

    青灯夜游青灯夜游2021-10-20 10:01:21转载62
    本篇文章给大家介绍一下Node.js中使用Winston库构建一个简单日志功能的方法,希望对大家有所帮助!

    Winston 是强大、灵活的 Node.js 开源日志库之一,理论上, Winston 是一个可以记录所有信息的记录器。这是一个高度直观的工具,易于定制。可以通过更改几行代码来调整其背后的逻辑。它使对数据库或文件等持久存储位置的日志记录变得简单容易。【推荐学习:《nodejs 教程》】

    Winston 提供以下功能:

    winston实践

    实践代码将在项目 pretender-service 中增加日志功能,安装依赖:

    npm install winston --save

    接下来需要初始化 logger ,由于项目中已经存在一个 logger.js 文件,这里再创建一个 winstonLogger.js ,代码如下:

    const { createLogger, format, transports } = require("winston");
    
    module.exports = createLogger({
        transports: [
            new transports.File({
                filename: "logs/server.log",
                level: "info",
                format: format.combine(
                    format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
                    format.align(),
                    format.printf(
                        (info) =>
                            `${info.level}: ${[info.timestamp]}: ${info.message}`
                    )
                ),
            }),
        ],
    });

    通过调用 winston 库中的 createLogger 函数来初始化记录器。在 transports 对象中,可以提供一个文件名将日志存储在文件中。默认情况下,日志记录未格式化并打印为带有两个参数的 JSON 字符串,日志消息和等级。

    下面对之前的 logger 进行修改,将winston 日志记录器加入进去,具体修改方式参阅代码,下面给出其使用方法:

    const winlogger = require("./winstonLogger");
    winlogger.info("日志内容");

    执行程序后可以会在根目录生成相应的日志文件 logs/server.log

    1.png

    也可以更改日志级别,修改 logger ,只在 console.error 方式下使用 winston

    2.png

    记录了数据库连接错误信息,上面的信息仅只是为了演示。

    多 transports

    winston 允许设置多种 transport ,在 winstonLogger.js 中更改 createLogger 函数如下:

    const { createLogger, format, transports } = require("winston");
    
    module.exports = createLogger({
        format: format.combine(
            format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
            format.align(),
            format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
        ),
        transports: [
            new transports.File({
                filename: "logs/info.log",
                level: "info",
                format: format.combine(
                    format.printf((i) =>
                        i.level === "info"
                            ? `${i.level}: ${i.timestamp} ${i.message}`
                            : ""
                    )
                ),
            }),
            new transports.File({
                filename: "logs/error.log",
                level: "error",
            }),
        ],
    });

    再次执行程序,将会看到 error.log info.log 文件,由于在 logger 中未设置 info ,因此 info.log 的内容为空,error.log 内容和上面的一样。

    多 loggers

    winston 允许设置多个 logger ,在实际项目中可以为每个模块创建一个记录器 logger , 如下代码,创建一个用户日志记录器和登录验证记录器:

    const { createLogger, format, transports } = require("winston");
    
    const customFormat = format.combine(
        format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
        format.align(),
        format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
    );
    
    const globalLogger = createLogger({
        format: customFormat,
        transports: [
            new transports.File({
                filename: "logs/info.log",
                level: "info",
                format: format.combine(
                    format.printf((i) =>
                        i.level === "info"
                            ? `${i.level}: ${i.timestamp} ${i.message}`
                            : ""
                    )
                ),
            }),
            new transports.File({
                filename: "logs/error.log",
                level: "error",
            }),
        ],
    });
    
    const authLogger = createLogger({
        transports: [
            new transports.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 相关的依赖库。

    npm install winston-daily-rotate-file --save

    安装完成后使用以下代码更新到 winstonLogger.js 文件:

    const { createLogger, format, transports } = require("winston");
    require("winston-daily-rotate-file");
    
    const customFormat = format.combine(
        format.timestamp({ format: "MMM-DD-YYYY HH:mm:ss" }),
        format.align(),
        format.printf((i) => `${i.level}: ${[i.timestamp]}: ${i.message}`)
    );
    const defaultOptions = {
        format: customFormat,
        datePattern: "YYYY-MM-DD",
        zippedArchive: true,
        maxSize: "20m",
        maxFiles: "14d",
    };
    const globalLogger = createLogger({
        format: customFormat,
        transports: [
            new transports.DailyRotateFile({
                filename: "logs/info-%DATE%.log",
                level: "info",
                ...defaultOptions,
            }),
            new transports.DailyRotateFile({
                filename: "logs/error-%DATE%.log",
                level: "error",
                ...defaultOptions,
            }),
        ],
    });
    
    const authLogger = createLogger({
        transports: [
            new transports.DailyRotateFile({
                filename: "logs/authLog-%DATE%.log",
                ...defaultOptions,
            }),
        ],
    });
    
    module.exports = {
        globalLogger: globalLogger,
        authLogger: authLogger,
    };

    运行项目,可以看到日志文件:

    3.png

    至此, Winston 的基本使用指南介绍完了,以上这些基本可以满足日常项目的需要了。

    更多编程相关知识,请访问:编程视频!!

    以上就是浅析Node.js+Winston库如何构建简单日志功能的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:Node.js Winston 日志
    上一篇:javascript的前身是什么 下一篇:浅析Angular中怎么导入本地JSON文件
    大前端线上培训班

    相关文章推荐

    • 怎么在Nodejs或者浏览器直接运行esm代码• 分场景讲解两个 Node.js 进程间如何进行通信!• 深入浅析Node.js中创建子进程的方法• 手把手教你怎么正确快速的部署一个TS Node.js项目!• 趣味讲解Node.js中的回调函数(附示例)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网