【问题标题】:how to store logs into mysql db using express-winston in Node.js如何在 Node.js 中使用 express-winston 将日志存储到 mysql db
【发布时间】:2021-07-09 04:42:52
【问题描述】:

我正在尝试使用 Node.js 中的 express-winston 将日志存储到 mysql db(带有 Sequelize)。

根据 doc(https://www.npmjs.com/package/winston-sql-transport),我应该执行以下操作:

const { Logger } = require('winston');
const { SQLTransport } = require('./../lib/winston-sql-transport');   
 
const logger = new Logger({
  transports: [
    new SQLTransport({
      tableName: 'winston_logs',
    })]
});
 
module.exports = logger;

我在app.js中应用了上面的代码,但是没有成功。

app.js

const { SQLTransport } = require('./../lib/winston-sql-transport'); // //Error: Cannot find module './../lib/winston-sql-transport'

const mysqlOption =  {
   tableName: 'winston_logs'
}

app.use(
  expressWinston.logger({
    transports: [
      new SQLTransport(mysqlOption)
    ],
    format: winston.format.combine(
      winston.format.timestamp({ format: timezoned }),
      winston.format.json(),
    ),
    metaField: null,
    expressFormat: true, 
    statusLevels: false,
    level: function (req, res) {
      var level = "";
      if (res.statusCode < 400) { level = "info"; }
      if (res.statusCode >= 400) { level = "warn"; }
      if (res.statusCode >= 500) { level = "error"; }
      return level;
    }
  })
)

我尝试将导入更改为const { SQLTransport } = require('winston-sql-transport');
结果错误:

Error: You have to define client

at new SQLTransport (/server/node_modules/winston-sql-transport/lib/winston-sql-transport.js:40:13)

我发现人们很少谈论这个包。
所以不知道有没有什么办法呢?

更新 1:

我按照评论的建议更新了mysqlOption

const { SQLTransport } = require('winston-sql-transport'); 

const mysqlOption =  {
  tableName : "winston_logs",
  client: 'mysql',
  connection: {
    host: '127.0.0.1:3306',
    user: 'root',
    password: '',
    database: 'mydb'
  }
}

日志成功显示在控制台中,但我的数据库中没有存储任何内容。

更新 2:
由于我使用的是 Sequelize,因此我将为日志表提供架构

// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;

module.exports = function (app) {
  const sequelizeClient = app.get('sequelizeClient');
  const logs = sequelizeClient.define('winston_logs', {
    id: {
      type: DataTypes.INTEGER(10),
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    level: {
      type: DataTypes.STRING(45),
      allowNull: false
    },
    message: {
      type: DataTypes.TEXT,
      allowNull: false
    },
    meta: {
      type: DataTypes.STRING(255),
      allowNull: false
    },
    hostname: {
      type: DataTypes.STRING(255),
      allowNull: false
    },
    timestamp: {
      type: DataTypes.DATE,
      allowNull: false
    },
  }, {
    hooks: {
      beforeCount(options) {
        options.raw = true;
      }
    }
  });

  logs.associate = function (models) {
  };

  return logs;
};

【问题讨论】:

  • 好吧,他们在编写文档时做得不好。如果您查看源代码,您应该能够找出问题所在。提示:mysqlOption = { tableName: 'winston_logs', client: 'mysql', connection: { host: '...', user: '...', password: '...', database: '...' } }github.com/ofkindness/winston-sql-transport/blob/master/lib/…
  • @Molda 我更新了上面的代码,你能看一下吗?
  • 我刚刚注意到该软件包在过去 3 年没有更新。我认为是时候寻找另一个包裹了。包中的 log 函数需要 4 个参数,但 winston 文件记录器中的相同函数只需要 2 个。首先是字符串,应该是对象,请参阅 thisthis

标签: mysql node.js sequelize.js winston


【解决方案1】:

终于放弃在mysql db中存储日志了,因为mysql传输包好像有点过时了。

相反,我使用winston-daily-rotate-file将日志存储在本地
它可以设置旋转的频率,文件的最大大小等。

链接:https://github.com/winstonjs/winston-daily-rotate-file

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2019-08-28
    • 2013-03-10
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多