>  기사  >  웹 프론트엔드  >  Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석

Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석

青灯夜游
青灯夜游앞으로
2021-10-20 10:01:211661검색

이 글에서는 Winston 라이브러리를 사용하여 Node.js에서 간단한 로깅 기능을 구축하는 방법을 소개하겠습니다.

Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석

Winston은 강력하고 유연한 Node.js 오픈 소스 로깅 라이브러리 중 하나입니다. 이론적으로 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

Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석

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

Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석

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

多 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

은 모든 정보를 기록할 수 있는 로거입니다. 이는 쉽게 사용자 정의할 수 있는 매우 직관적인 도구입니다. 그 뒤에 있는 논리는 몇 줄의 코드를 변경하여 조정할 수 있습니다. 데이터베이스나 파일과 같은 영구 저장 위치에 대한 로깅을 간단하고 쉽게 만듭니다. [추천 학습: "nodejs tutorial

"]

Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석Winston

다음 기능을 제공합니다:

  • 로그 기록 방법 및 시기를 중앙 집중식으로 제어: 한 곳에서 코드 변경
  • 로그가 전송되는 위치 제어 : 여러 대상(예: Elasticsearch, MongoDB, Postgres 등)에 로그를 동기식으로 저장합니다.
  • 맞춤형 로그 형식: 타임스탬프, 색상 로그 수준, JSON 형식 등과 같은 접두사가 포함됩니다.

winston practice

연습 코드는 pretender-service 로깅 기능 추가, 종속성 설치:
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,
};
🎜 다음으로 logger를 초기화해야 합니다. 프로젝트에는 이미 logger.js 파일이 있으므로 여기에 또 다른 winstonLogger.js를 생성하세요. 코드는 다음과 같습니다: 🎜rrreee🎜winston을 호출합니다. 라이브러리 >createLogger 함수를 사용하여 로거를 초기화합니다. transports 객체에서 파일 이름을 제공하여 로그를 파일에 저장할 수 있습니다. 기본적으로 로깅은 형식화되지 않고 로그 메시지와 수준이라는 두 개의 매개변수가 포함된 JSON 문자열로 인쇄됩니다. 🎜🎜 다음으로 이전 logger를 수정하고 winston 로거를 추가하세요. 구체적인 수정 방법은 다음과 같습니다. 🎜rrreee🎜Execute 프로그램 후에는 해당 로그 파일이 루트 디렉터리 logs/server.log🎜🎜Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석🎜🎜로그 수준 변경, 로거 수정도 콘솔에서만 가능합니다. .error 모드에서 winston 사용: 🎜🎜Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석🎜🎜 데이터베이스 연결 오류 정보를 기록합니다. 위 정보는 데모용입니다. 🎜

다중 전송

🎜winston을 사용하면 winstonLogger.js에서 여러 전송을 설정할 수 있습니다. > 코드>의 createLogger 함수를 다음과 같이 변경합니다. 🎜rrreee🎜프로그램을 다시 실행하면 error.log info.log가 표시됩니다. > 파일, loggerinfo가 설정되지 않았기 때문에 info.log의 내용은 비어 있고 error의 내용은 .log는 위와 동일합니다. 🎜

다중 로거

🎜winston을 사용하면 실제로 각 모듈에 설정할 수 있는 여러 로거를 설정할 수 있습니다. 프로젝트 로거 logger를 생성합니다. 다음 코드는 사용자 로거 및 로그인 확인 로거를 생성합니다. 🎜rrreee🎜수정된 코드는 전역 로거 globalLogger 및 인증 로거 를 생성합니다. authLogger, logger.js에 대한 해당 수정 사항: 🎜rrreee

일일 롤링 로그 파일

🎜 소개된 모범 사례에서 언급했듯이 이전에는 특정 조건(일반적으로 날짜, 크기)에 따라 로그 파일을 분할하고 로그를 저장할 일 수를 설정했습니다. 이러한 요구 사항을 실현하려면 🎜Winston🎜 관련 종속성 라이브러리를 설치해야 합니다. 🎜rrreee🎜설치가 완료된 후 다음 코드를 사용하여 winstonLogger.js 파일을 업데이트합니다. 🎜rrreee🎜프로젝트를 실행하면 로그 파일을 볼 수 있습니다. 🎜🎜🎜🎜🎜이 시점에서 , 🎜Winston🎜의 기본 사용 가이드가 소개되었습니다. 이상으로 기본적으로 일일 프로젝트의 요구 사항을 충족할 수 있습니다. 🎜

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !

위 내용은 Node.js+Winston 라이브러리가 간단한 로깅 기능을 구축하는 방법에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제