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
}
类似地, npm
日志记录级别的优先级从 0 到 6(从高到低):
{
error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
}
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' });
先决条件
Winston Logger 入门
在当前目录下创建一个node项目:
mkdir winston-nodejs-example
cd winston-nodejs-example
初始化一个 npm 项目:
npm init -y
安装 express 和 winston 包:
npm i winston express
创建一个名为index.js
file:的入口文件
touch index.js
创建一个基本的 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}`);
});
使用以下命令运行服务器并点击http://localhost:5555
:
node index.js
如果操作正确,控制台应该显示Listening on http://localhost:5555

现在,在当前目录中创建一个logger.js
文件,我们将在其中配置 winston 记录器:
const {createLogger, format, transports} = require("winston");
const logger = createLogger({
level: "debug",
format: format.json(),
transports: [new transports.Console()],
});
module.exports = logger;
此时,项目结构应如下所示:
/node_modules
/index.js
/logger.js
/package-lock.json
/package.json
导入记录器并在需要的地方使用它。使用记录器后的最终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}`);
});
我们将根据所走的路线捕获日志。
回家路线

主页路线日志

用户错误路由

用户错误日志

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
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}"
创建一个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"]
在将应用程序部署到 Docker 容器之前,我们需要设置运行应用程序所需的环境变量。 .env
在文件夹的根目录中创建一个名为的文件。
由于我们在文件中将端口定义为变量 docker-compose.yml
,因此我们需要在文件中设置端口 .env
:
PORT=5555
运行应用程序
最后,我们可以将 Node 应用部署到 Docker 容器上。为此,请使用 Docker Compose:
docker compose up --build
一旦构建成功运行,您应该能够在控制台上看到以下日志。

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



如果 SigNoz 安装在不同的主机上,您可以按照这些说明收集日志。
结论
日志在开发人员的工作流程中扮演着至关重要的角色,对于应用程序的调试也至关重要。Winston 是一个简单的日志库,它使日志记录过程更加灵活且易于扩展。日志生成后,您可以使用 SigNoz 进行收集。
SigNoz 使用 OpenTelemetry 收集日志。借助 OpenTelemetry,您还可以将日志与其他遥测信号(例如指标和跟踪)关联起来。日志中包含上下文信息可以帮助您更快地调试应用程序。您可以从日志文档中获取 SigNoz 日志管理的概述。
相关文章
鏂囩珷鏉ユ簮锛�https://dev.to/signoz/winston-logger-full-tutorial-with-a-sample-nodejs-application-2fm9