Winston-MySQL 使用文档

76 阅读3分钟

Winston-MySQL 使用文档

目录

[TOC]

简介

winston-mysql 是一个为 winston@3.x 日志库设计的MySQL传输插件,允许你在 Node.js 应用程序中将日志存储到 MySQL 数据库。这个插件支持自定义日志表字段和 JSON 格式的元数据字段,适用于 MySQL 5.7 及以上版本。

安装

首先,你需要在你的 MySQL 数据库中创建一个表来存储日志。以下是创建日志表的 SQL 语句示例:

CREATE TABLE `your_database_name`.`st_logs` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `level` VARCHAR(16) NOT NULL,
  `message` VARCHAR(2048) NOT NULL,
  `meta` VARCHAR(2048) NOT NULL,
  `timestamp` DATETIME NOT NULL,
  PRIMARY KEY (`id`)
);

然后,通过 npm 安装 winston-mysql

$ npm install winston-mysql

配置

环境变量配置

在配置 winston-mysql 之前,你需要从配置文件中读取数据库连接信息。这些信息通常存储在环境变量或配置文件中,以确保安全性和灵活性。

const {
  MYSQL_HOST,
  MYSQL_USER,
  MYSQL_PWD,
  MYSQL_DB,
} = require("../config/config.default");

这里, MYSQL_HOSTMYSQL_USERMYSQL_PWDMYSQL_DB 是从配置文件中读取的数据库连接参数。

日志级别和表配置

winston-mysql 允许你为不同的日志级别设置不同的存储表。在以下配置中,我们定义了一个名为 options_default 的对象,其中包含了数据库连接信息和日志表名称。

const options_default = {
  host: MYSQL_HOST,
  user: MYSQL_USER,
  password: MYSQL_PWD,
  database: MYSQL_DB,
  level: "error",
  table: "st_logs",
};
  • host : 数据库服务器地址。
  • user : 数据库用户名。
  • password : 数据库密码。
  • database : 要连接的数据库名称。
  • level : 此传输的日志级别,默认为 error ,意味着只有 error 级别及以上的日志会被存储。
  • table : 存储日志的表名。
创建 Logger 实例

使用 createLogger 函数创建一个 winston 日志记录器实例,并配置其格式和传输方式。

const logger = createLogger({
  level: "info",
  format: format.json(),
  transports: [
    // ...其他传输配置
    new winstonMysql(options_default),
  ],
});
  • level : 日志记录器的默认级别,这里设置为 info ,意味着所有 info 级别及以上的日志都会被处理。
  • format : 日志的格式,这里使用 json 格式。
文件传输配置

除了将日志存储到数据库,还可以将日志输出到文件。

new transports.File({
  filename: "info.log",
  level: "info",
  format: format.combine(
    format((info) => (info.level === "info" ? info : false))(),
    format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
    format.json()
  ),
}),
  • filename : 日志文件的名称。
  • level : 此文件传输的日志级别。
  • format : 组合格式,包括过滤 info 级别的日志、添加时间戳和 JSON 格式。
控制台输出配置

在非生产环境中,你可能希望将日志输出到控制台。

if (process.env.NODE_ENV !== "production") {
  logger.add(
    new transports.Console({
      format: format.combine(
        format.colorize(),
        format.simple()
      ),
    })
  );
}
  • format.colorize() : 为日志添加颜色。
  • format.simple() : 使用简单格式输出日志。
完整代码
const { createLogger, format, transports } = require("winston");
const winstonMysql = require("winston-mysql");
 
const {
  MYSQL_HOST,
  MYSQL_USER,
  MYSQL_PWD,
  MYSQL_DB,
} = require("../config/config.default");
 
const options_default = {
  host: MYSQL_HOST,
  user: MYSQL_USER,
  password: MYSQL_PWD,
  database: MYSQL_DB,
  level: "error",
  table: "st_logs",
};
 
const logger = createLogger({
  level: "info",
  format: format.json(),
  transports: [
    new transports.File({
      filename: "info.log",
      level: "info",
      format: format.combine(
        format((info) => (info.level === "info" ? info : false))(),
        format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
        format.json()
      ),
    }),
    new winstonMysql(options_default),
  ],
});
 
if (process.env.NODE_ENV !== "production") {
  logger.add(
    new transports.Console({
      format: format.combine(
        format.colorize(),
        format.simple()
      ),
    })
  );
}

使用方法

winston-mysql 提供了一些实用的日志方法,你可以在你的应用程序中这样使用它们:

const logInfo = (message, meta = {}) => {
  logger.info(message, { ...meta });
};
 
const logError = (message, error, meta = {}) => {
  const errorObj = error instanceof Error ? error : null;
  logger.error(message, {
    message: errorObj ? errorObj.message : error.message,
    stack: errorObj ? errorObj.stack : error.message,
    ...meta,
  });
};
 
const logWarn = (message, meta = {}) => {
  logger.warn(message, { ...meta });
};
记录信息日志
logInfo("这是一条信息日志", { customField: "customValue" });
记录错误日志
logError("这是一条错误日志", new Error("出错了"), { customField: "customValue" });
记录警告日志
logWarn("这是一条警告日志", { customField: "customValue" });

总结

Node === Winston 日志工具详解-CSDN博客
Winston 日志工具详解

通过上述配置和方法,你可以灵活地将日志存储到 MySQL 数据库,并根据需要输出到文件和控制台。这为日志管理和问题排查提供了强大的支持。