Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt

Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt

青灯夜游
青灯夜游nach vorne
2021-10-20 10:01:211617Durchsuche

In diesem Artikel erfahren Sie, wie Sie mit der Winston-Bibliothek eine einfache Protokollierungsfunktion in Node.js erstellen.

Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt

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

Winston 提供以下功能:

  • 集中控制日志记录的方式和时间:在一个地方更改代码即可
  • 控制日志发送的位置:将日志同步保存到多个目的地(如Elasticsearch、MongoDB、Postgres等)。
  • 自定义日志格式:带有时间戳、颜色日志级别、JSON格式等前缀。

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

Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt

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

Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt

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

多 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.jsWinston

ein Logger, der alle Informationen aufzeichnen kann. Dies ist ein äußerst intuitives Tool, das leicht anzupassen ist. Die Logik dahinter kann durch Änderung einiger Codezeilen angepasst werden. Es macht die Protokollierung an dauerhaften Speicherorten wie Datenbanken oder Dateien einfach und unkompliziert. [Empfohlenes Lernen: „nodejs Tutorial

"]

Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstelltWinston

Bietet die folgenden Funktionen:

  • Zentrale Kontrolle darüber, wie und wann Protokolle aufgezeichnet werden: Ändern Sie den Code an einer Stelle
  • Kontrollieren Sie, wohin Protokolle gesendet werden : Protokolle synchron an mehreren Zielen speichern (z. B. Elasticsearch, MongoDB, Postgres usw.).
  • Angepasstes Protokollformat: mit Präfixen wie Zeitstempel, Farbprotokollebene, JSON-Format usw.

Winston-Übung

Der Übungscode wird im Projekt sein Pretender-Service Protokollierungsfunktion hinzufügen, Abhängigkeiten installieren:
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,
};
🎜 Als nächstes müssen Sie logger initialisieren, Da das Projekt bereits eine logger.js-Datei hat, erstellen Sie hier eine weitere winstonLogger.js. Der Code lautet wie folgt: 🎜rrreee🎜Durch Aufrufen der winston -Bibliothek >createLogger-Funktion zum Initialisieren des Loggers. Im transports-Objekt können Sie einen Dateinamen angeben, um die Protokolle in einer Datei zu speichern. Standardmäßig ist die Protokollierung unformatiert und wird als JSON-Zeichenfolge mit zwei Parametern, der Protokollnachricht und der Ebene, gedruckt. 🎜🎜 Als nächstes ändern Sie den vorherigen logger und fügen den winston-Logger hinzu. Bitte beachten Sie den Code für die spezifische Änderungsmethode: 🎜rrreee🎜Ausführen Nach dem Programm kann die entsprechende Protokolldatei im Stammverzeichnis logs/server.log🎜🎜Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt🎜🎜Sie können auch die Protokollebene ändern, logger ändern, nur in console .error Verwenden Sie winston im Modus: 🎜🎜Eine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt🎜🎜 zeichnet Informationen zu Datenbankverbindungsfehlern auf. Die oben genannten Informationen dienen nur zur Demonstration. 🎜

Mehrere Transporte

🎜winston ermöglicht das Festlegen mehrerer Transporte in winstonLogger.js Ändern Sie die Funktion createLogger im Code> wie folgt: 🎜rrreee🎜Führen Sie das Programm erneut aus, Sie sehen das error.log und info.log Dateien, da info nicht in logger festgelegt ist, sodass der Inhalt von info.log leer ist und der Inhalt von error .log ist dasselbe wie oben. Das Gleiche. 🎜

Mehrere Logger

🎜winston ermöglicht die Einstellung mehrerer Logger, die für jedes Modul in tatsächlichen Projekten festgelegt werden können Erstellen Sie einen Logger logger. Der folgende Code erstellt einen Benutzer-Logger und einen Login-Verifizierungs-Logger: 🎜rrreee🎜Der geänderte Code erstellt einen globalen Logger globalLogger und einen Authentifizierungs-Logger authLogger , entsprechende Änderungen an logger.js: 🎜rrreee

Täglich rollierende Protokolldatei

🎜 Wie in den zuvor vorgestellten Best Practices erwähnt , teilen Sie die Protokolldateien nach bestimmten Bedingungen auf, normalerweise nach Datum und Größe, und legen Sie die Anzahl der Tage fest, die die Protokolle gespeichert werden sollen. Um diese Anforderungen zu realisieren, ist die Installation einer 🎜Winston🎜-bezogenen Abhängigkeitsbibliothek erforderlich. 🎜rrreee🎜Nachdem die Installation abgeschlossen ist, verwenden Sie den folgenden Code, um die Datei winstonLogger.js zu aktualisieren: 🎜rrreee🎜Führen Sie das Projekt aus und Sie können die Protokolldatei sehen: 🎜🎜🎜🎜🎜An diesem Punkt , der grundlegende Nutzungsleitfaden von 🎜Winston🎜 wird vorgestellt. Das ist alles, das oben Genannte kann grundsätzlich die Anforderungen täglicher Projekte erfüllen. 🎜

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmiervideos! !

Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie die Node.js+Winston-Bibliothek eine einfache Protokollierungsfunktion erstellt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen