Winston Logger-带有示例Nodejs应用程序的完整教程
#javascript #node #devops #logs

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

Basic nodejs express app

基本nodejs express app

现在,在当前目录中,创建一个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}`);
});

将根据我们击中的路线捕获日志。

家庭路线

nodejs express app home route

nodejs Express App Home Route

家用路线日志

winston logs for home route

winston for Home Route

用户错误路由

Nodejs express error route

nodejs express错误路由

用户错误日志

User Error logs

用户错误日志

404路线

Nodejs express app 404 route

nodejs Express App 404 Route

404路线日志

404 route logs

404路线日志

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

Signoz中的日志管理

signoz是全栈开源应用程序性能监视工具,您可以用于监视日志,指标和跟踪。拥有所有重要的遥测信号under a single dashboard会导致开销较少。用户还可以通过关联这些信号来访问具有更丰富上下文的遥测数据。

signoz使用柱状数据库-Clickhouse,用于有效地存储日志。像UberCloudflare这样的大公司已从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

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

Nodejs Winston logs on console

nodejs winston登录控制台

观察Signoz上的日志

现在,按照我们较早点击的不同路线检查日志,即//404/user,我们应该能够如下观察signoz中的日志。

winston logs with SigNoz

winston用signoz

winston logs with SigNoz

winston用signoz

winston logs with SigNoz

winston logs with signoz

如果将Signoz安装在另一个主机上,则可以通过遵循这些instructions来收集日志。

结论

日志在开发人员的工作流程中起着至关重要的作用,对于调试应用程序至关重要。温斯顿是一个简单的记录库,使记录过程更加灵活和扩展。生成日志后,您可以使用Signoz收集它们。

signoz使用opentelemetry收集日志。使用OpentElemetry,您还可以将日志与其他遥测信号(如指标和痕迹)相关联。在日志中使用上下文信息可以帮助您更快地调试应用程序。您可以从logs documentation中获得Signoz中的日志管理概述。


相关文章

SigNoz - a lightweight open source ELK alternative