Winston Logger是Node.js的最受欢迎的记录库之一。它被设计为一个简单而通用的记录库,支持多种运输模式。传输本质上是日志的存储设备。
每个记录器可以具有多种在不同级别配置的传输模式。例如,人们可能想要存储在数据库中的错误日志,但所有日志输出到控制台或本地文件。
Winston Logger的某些功能是:
- 记录级别
- 运输
- 格式
- 分析
温斯顿记录仪中的记录级别是多少?
winston
中的记录级别遵循RFC5424指定的严重性顺序:所有级别的严重性被认为是数值上的升序从最重要到最重要的*。*
每个level
均得到特定的整数优先级。优先级越高,考虑消息的重要性越重要,相应的整数优先级就越少。例如,如RFC5424中指定的syslog
级别从0优先级(最高到最低)。
{
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 Logger都可以具有多种在不同级别配置的传输模式。
温斯顿带有三种核心运输方式:控制台,文件和http。必须创建传输并将其添加到伐木者中。
这是我们初始化不同运输的方式:
-
* 控制台运输: *
logger.add(new winston.transports.Console(options));
-
文件传输:
logger.add(new winston.transports.File(options));
-
http传输:
logger.add(new winston.transports.Http(options));
Winston Logger的格式
可以从winston.format
访问winston
中的格式。它们是在[logform](https://github.com/winstonjs/logform)
中实现的,这是一个与winston
单独的模块。在编写运输时,这允许灵活性,以防您希望在运输中包括默认格式。
在现代版本中,node
模板字符串非常具有性能,并且是进行大多数最终用户格式的推荐方法。
与Winston Logger进行分析
除了记录消息和元数据外,winston
还为任何记录器实现了简单的分析机制。
默认情况下,所有配置文件都设置为“信息”级别,并且消息和元数据都是可选的。对于单个配置文件,您可以通过提供alevel
属性的元数据对象来覆盖默认日志级别:
logger.profile('test', { level: 'debug' });
先决条件
Winston Logger入门
在当前目录中创建一个节点项目:
mkdir winston-nodejs-example
cd winston-nodejs-example
初始化一个NPM项目:
npm init -y
安装Express和Winston软件包:
npm i winston express
创建一个名为index.js
文件的条目文件:
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 Logger:
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- Winston记录库收集的日志开源APM和可观察性工具。
Signoz中的日志管理
signoz是全栈开源应用程序性能监视工具,您可以用于监视日志,指标和跟踪。拥有所有重要的遥测信号under a single dashboard会导致开销较少。用户还可以通过关联这些信号来访问具有更丰富上下文的遥测数据。
signoz使用柱状数据库-Clickhouse,用于有效地存储日志。像Uber和Cloudflare这样的大公司已从Elasticsearch转移到Clickhouse,以存储其日志数据。
将日志发送到部署在Docker上的Signoz
我们将扩展到我们的Nodejs应用程序,并在Docker中运行该应用程序。我们将为温斯顿使用控制台运输。如果Signoz在同一主机上运行,它将自动开始收集所有Docker容器的日志。
安装和运行Signoz应用程序
signoz可以通过使用简单的安装脚本在三个步骤中安装在MacOS或Linux计算机上。
安装脚本会在Linux上自动安装Docker Engine。但是,在MacOS上,您必须在运行安装脚本之前手动安装Docker Engine。
git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh
扩展节点应用程序
创建一个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
运行该应用程序
最后,我们可以在Docker容器上部署节点应用程序。为此,请使用Docker组成:
docker compose up --build
成功运行构建后,您应该能够在控制台上看到以下日志。
观察Signoz上的日志
现在,按照我们较早点击的不同路线检查日志,即/
,/404
,/user
,我们应该能够如下观察signoz中的日志。
如果将Signoz安装在另一个主机上,则可以通过遵循这些instructions来收集日志。
结论
日志在开发人员的工作流程中起着至关重要的作用,对于调试应用程序至关重要。温斯顿是一个简单的记录库,使记录过程更加灵活和扩展。生成日志后,您可以使用Signoz收集它们。
signoz使用opentelemetry收集日志。使用OpentElemetry,您还可以将日志与其他遥测信号(如指标和痕迹)相关联。在日志中使用上下文信息可以帮助您更快地调试应用程序。您可以从logs documentation中获得Signoz中的日志管理概述。
相关文章