Winston Logger - 带有示例 Nodejs 应用程序的完整教程

2025-06-10

Winston Logger - 带有示例 Nodejs 应用程序的完整教程

Winston Logger 是 Node.js 最受欢迎的日志库之一。它旨在成为一个简单通用的日志库,支持多种传输模式。传输本质上是日志的存储设备。

每个记录器可以配置多种传输模式,级别各不相同。例如,你可能希望将错误日志存储在数据库中,但所有日志都输出到控制台或本地文件。

Winston 记录器的一些功能如下:

  • 日志级别
  • 交通
  • 格式
  • 分析

Winston 记录器中的记录级别是什么?

日志记录级别 遵循RFC5424winston 指定的严重性顺序 :所有级别的严重性均假定为按数字  从最重要到最不重要升序排列*。*

每个消息都 level 分配有一个特定的整数优先级。优先级越高,消息被认为越重要,相应的整数优先级也越低。例如,根据RFC5424中的规定,优先级 syslog 从 0 到 7(从高到低)。

{
  emerg: 0,
  alert: 1,
  crit: 2,
  error: 3,
  warning: 4,
  notice: 5,
  info: 6,
  debug: 7
}
Enter fullscreen mode Exit fullscreen mode

类似地, npm 日志记录级别的优先级从 0 到 6(从高到低):

{
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6
}
Enter fullscreen mode Exit fullscreen mode

Winston 记录器中的传输是什么?

传输器是日志的存储设备或输出机制。每个 Winston 记录器都可以在不同级别配置多种传输模式。

Winston 提供三种核心传输模式:控制台、文件和 HTTP。必须创建传输模式并将其添加到记录器中。

以下是我们初始化不同传输的方式:

  • *控制台传输: *

    logger.add(new winston.transports.Console(options));
    
  • 文件传输:

    logger.add(new winston.transports.File(options));
    
  • HTTP 传输:

    logger.add(new winston.transports.Http(options));
    

Winston 记录器中的格式

中的格式 winston 可以通过 访问 winston.format。它们在 中实现 [logform](https://github.com/winstonjs/logform),这是一个独立的模块 winston。如果您希望在传输中包含默认格式,这可以提高编写传输时的灵活性。

在现代版本中, node 模板字符串的性能非常高,并且是进行大多数最终用户格式化的推荐方式。

使用 Winston 记录器进行分析

除了记录消息和元数据之外, winston 还为任何记录器实现了简单的分析机制。

所有配置文件消息默认设置为“信息”级别,并且消息和元数据均为可选。对于单个配置文件消息,您可以通过为元数据对象提供以下 level 属性来覆盖默认日志级别:

logger.profile('test', { level: 'debug' });
Enter fullscreen mode Exit fullscreen mode

先决条件

Winston Logger 入门

在当前目录下创建一个node项目:

mkdir winston-nodejs-example
cd winston-nodejs-example 
Enter fullscreen mode Exit fullscreen mode

初始化一个 npm 项目:

npm init -y
Enter fullscreen mode Exit fullscreen mode

安装 express 和 winston 包:

npm i winston express
Enter fullscreen mode Exit fullscreen mode

创建一个名为index.jsfile:的入口文件

touch index.js
Enter fullscreen mode Exit fullscreen mode

创建一个基本的 Hello World Express 应用程序:

const express = require("express");
const PORT = process.env.PORT || "5555";
const app = express();

app.use(express.json())

app.get("/", (req, res) => {
    res.json({ method: req.method, message: "Hello World", ...req.body });
});

app.get('/404', (req, res) => {
    res.sendStatus(404);
})

app.get("/user", (req, res, next) => {
    try {
      throw new Error("Invalid user");
    } catch (error) {
      res.status(500).send("Error!");
    }
  });

app.listen(parseInt(PORT, 10), () => {
    console.log(`Listening on http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

使用以下命令运行服务器并点击http://localhost:5555

node index.js
Enter fullscreen mode Exit fullscreen mode

如果操作正确,控制台应该显示Listening on http://localhost:5555

基本 Node.js Express 应用
基本 Node.js Express 应用

现在,在当前目录中创建一个logger.js文件,我们将在其中配置 winston 记录器:

const {createLogger, format, transports} = require("winston");

const logger = createLogger({
  level: "debug",
  format: format.json(),
  transports: [new transports.Console()],
});

module.exports = logger;
Enter fullscreen mode Exit fullscreen mode

此时,项目结构应如下所示:

/node_modules
/index.js
/logger.js
/package-lock.json
/package.json
Enter fullscreen mode Exit fullscreen mode

导入记录器并在需要的地方使用它。使用记录器后的最终index.js效果如下:

const express = require("express");
const logger = require("./logger");
const PORT = process.env.PORT || "5555";
const app = express();

app.use(express.json())

app.get("/", (req, res) => {
    logger.log("debug", "Hello, World!"); //debug level as first param
    logger.debug("The is the home '/' route.");
    // using debug method directly
    res.json({ method: req.method, message: "Hello World", ...req.body });
});

app.get('/404', (req, res) => {
    logger.error("404 error"); //error method
    logger.debug("The is the 404 route.");
    res.sendStatus(404);
})

app.get("/user", (req, res) => {
    try {
      throw new Error("Invalid user");
    } catch (error) {
      logger.error("Auth Error: invalid user");
      logger.debug("The is the user route.");
      res.status(500).send("Error!");
    }
  });

app.listen(parseInt(PORT, 10), () => {
    console.log(`Listening on http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

我们将根据所走的路线捕获日志。

回家路线

nodejs express 应用主页路线
Nodejs Express 应用主页路线

主页路线日志

温斯顿回家路线日志
温斯顿回家路线日志

用户错误路由

Nodejs express 错误路由
Nodejs express 错误路由

用户错误日志

用户错误日志
用户错误日志

404 路线

Nodejs Express 应用 404 路由
Nodejs Express 应用 404 路由

404 路由日志

404 路由日志
404 路由日志

在生产环境中,您需要一个日志管理工具来高效地存储和管理日志。在本教程中,我们将使用 SigNoz - 一个开源的 APM 和可观察性工具,用于管理 Winston 日志库收集的日志。

SigNoz 中的日志管理

SigNoz 是一款全栈开源应用程序性能监控工具,可用于监控日志、指标和轨迹。将所有重要的遥测信号 集中在一个仪表板下,可以降低运营成本。用户还可以通过关联这些信号来访问具有更丰富上下文的遥测数据。

SigNoz 使用列式数据库 ClickHouse 来高效存储日志。Uber 和 Cloudflare等大公司已将日志数据存储从 Elasticsearch 转移到 ClickHouse

将日志发送到部署在 Docker 上的 SigNoz

我们将把 Node.js 应用程序 Docker 化,并在 Docker 中运行该应用程序。我们将使用 Winston 的控制台传输。如果 SigNoz 在同一主机上运行,​​它将自动开始收集所有 Docker 容器的日志。

安装并运行 SigNoz 应用程序

只需三个步骤,使用简单的安装脚本即可在 macOS 或 Linux 计算机上安装 SigNoz。

安装脚本会自动在 Linux 上安装 Docker Engine。但是在 macOS 上,您必须  在运行安装脚本之前手动安装Docker Engine 。

git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh
Enter fullscreen mode Exit fullscreen mode

Docker 化 Node 应用

创建一个docker-compose.yaml文件并粘贴以下代码:

version: "3.9"

services:
  app:
    container_name: app
    image: app
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
      target: base
    ports:
      - "${PORT}:${PORT}"
Enter fullscreen mode Exit fullscreen mode

创建一个Dockerfile(不需要文件扩展名)并粘贴以下代码:

FROM node:alpine as base

WORKDIR /winston-nodejs-example # current project name 

COPY package.json ./

RUN rm -rf node_modules && npm i

COPY . .

CMD ["node",  "index.js"]
Enter fullscreen mode Exit fullscreen mode

在将应用程序部署到 Docker 容器之前,我们需要设置运行应用程序所需的环境变量。 .env在文件夹的根目录中创建一个名为的文件。

由于我们在文件中将端口定义为变量 docker-compose.yml ,因此我们需要在文件中设置端口 .env :

PORT=5555
Enter fullscreen mode Exit fullscreen mode

运行应用程序

最后,我们可以将 Node 应用部署到 Docker 容器上。为此,请使用 Docker Compose:

docker compose up --build
Enter fullscreen mode Exit fullscreen mode

一旦构建成功运行,您应该能够在控制台上看到以下日志。

Nodejs Winston 登录控制台
Nodejs Winston 登录控制台

观察 SigNoz 上的日志

现在,点击我们之前点击过的不同路线来检查日志,即/,,我们应该能够在 SigNoz 中查看日志,如下所示/404/user

Winston 使用 SigNoz 记录日志
Winston 使用 SigNoz 记录日志

Winston 使用 SigNoz 记录日志
Winston 使用 SigNoz 记录日志

Winston 使用 SigNoz 记录日志
Winston 使用 SigNoz 记录日志

如果 SigNoz 安装在不同的主机上,您可以按照这些说明收集日志。

结论

日志在开发人员的工作流程中扮演着至关重要的角色,对于应用程序的调试也至关重要。Winston 是一个简单的日志库,它使日志记录过程更加灵活且易于扩展。日志生成后,您可以使用 SigNoz 进行收集。

SigNoz 使用 OpenTelemetry 收集日志。借助 OpenTelemetry,您还可以将日志与其他遥测信号(例如指标和跟踪)关联起来。日志中包含上下文信息可以帮助您更快地调试应用程序。您可以从日志文档中获取 SigNoz 日志管理的概述。


相关文章

SigNoz——轻量级开源 ELK 替代品

鏂囩珷鏉ユ簮锛�https://dev.to/signoz/winston-logger-full-tutorial-with-a-sample-nodejs-application-2fm9
PREV
如何用 ExpressJS 最简单地创建 TypeScript 项目!作者:SilvenLEAF
NEXT
Docker 101:Docker GenAI 简介 LIVE! | 2025 年 6 月 4 日