【问题标题】:Why Winston 3.0.0 is not working with Sails 0.12?为什么 Winston 3.0.0 不能与 Sails 0.12 一起使用?
【发布时间】:2018-08-19 07:31:06
【问题描述】:

我在文件config/log.js中有这些设置

let {transports: transp, createLogger} = require('winston');    
let commonSettings = {
    colorize: false,
    maxsize: 10000000,
    maxfiles: 10,
    timestamp: true
};

let settings = [{ filename: 'logs/warn.log', level: 'warn' }];    
let logger = createLogger({
    transports: settings.map(s => new transp.File({...s, ...commonSettings}))
});

module.exports.log = {
    custom: logger,
    inspect: false
};

当我尝试使用此命令 sails lift 启动 Sails 服务器时,我收到以下错误:

Uncaught TypeError: this.write is not a function
  at Function.DerivedLogger.(anonymous function) (node_modules/winston/lib/winston/create-logger.js:45:14)
  at Function._writeLogToConsole [as error] (node_modules/captains-log/lib/write.js:78:16)
  at Sails.runBootstrap (node_modules/sails/lib/app/private/bootstrap.js:56:17)
  at Sails.bound [as runBootstrap] (node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
  at Sails.initialize (node_modules/sails/lib/app/private/initialize.js:48:9)
  at bound (node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:607:21
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:246:17
  at iterate (node_modules/sails/node_modules/async/lib/async.js:146:13)
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:157:25
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:248:21
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:612:34
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/lib/app/load.js:201:13
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:451:17
  at /Users/egomezr/Documents/stack/backend/node_modules/sails/node_modules/async/lib/async.js:441:17
  at _each (node_modules/sails/node_modules/async/lib/async.js:46:13)
  at Immediate.taskComplete (node_modules/sails/node_modules/async/lib/async.js:440:13)
  at process.topLevelDomainCallback (domain.js:101:23)

可能是什么问题?

【问题讨论】:

  • 您确定您正在关注版本的文档吗? 3.0.0?例如,创建传输只需要路径和级别作为参数,而不是您提供的内容。
  • @logout 我确定这些设置是有效的。

标签: node.js sails.js winston


【解决方案1】:

看起来 Sails 对 Winston 记录器进行了某种绑定,因此记录器失去了一些功能。

未决问题: issues/4337

我找到了解决方法:

let commonSettings = {
    colorize: false,
    maxsize: 10000000,
    maxfiles: 10,
    json: false
};

let settings = [
    {filename: `${__dirname}/../logs/warn.log`, level: 'warn'},
    {filename: `${__dirname}/../logs/error.log`, level: 'error'},
    {filename: `${__dirname}/../logs/debug.log`, level: 'debug'},
    {filename: `${__dirname}/../logs/info.log`, level: 'info'}
];

let {transports, createLogger, format} = require('winston');
let loggerSettings = {
    transports: [...settings.map(s => new transports.File({...s, ...commonSettings})), new transports.Console({
        format: format.simple()
    })],
    exitOnError: false
};

// This is the workaround
let winstonLogger = createLogger(loggerSettings);
let logger = {
    'info': function () {
        winstonLogger.info(...arguments);
    },
    'debug': function () {
        winstonLogger.debug(...arguments);
    },
    'error': function () {
        winstonLogger.error(...arguments);
    },
    'warn': function () {
        winstonLogger.warn(...arguments);
    },
    'log': function () {
        winstonLogger.log(...arguments);
    }
};
// End of workaround

module.exports.log = {
    custom: logger,
    inspect: false
};

【讨论】:

    【解决方案2】:

    不管怎样,他似乎在 Sails 问题中被报道,但在 https://github.com/balderdashy/sails/issues/4209 中无意中被关闭。

    【讨论】:

    • 是的,我认为重新打开该问题会很好。 未解决的问题: issues/4337
    猜你喜欢
    • 2018-03-09
    • 2021-06-14
    • 2012-10-09
    • 2020-03-18
    • 2017-11-21
    • 2019-04-11
    • 2012-09-19
    • 2013-12-30
    • 2011-04-20
    相关资源
    最近更新 更多