【问题标题】:Winston is not writing logs to filesWinston 没有将日志写入文件
【发布时间】:2018-03-21 08:20:12
【问题描述】:

我为 Winston 中的错误和警告进行了两次传输,据说是写入文件。控制台日志记录的现有传输工作正常,我确实检查了pm2 logs 并看到了日志,但文件传输没有保存任何内容。

'use strict';

const winston = require('winston');
const m = require('moment-timezone');
let logger = null;
/**
 * Initializes the logger
 * @param {object} configLogging
 */
module.exports.initialize = function initialize(configLogging) {
  const dateFormat = 'dddd, MMMM Do YYYY, h:mm:ss a';

  logger = new winston.Logger({
    transports: [
      new (winston.transports.Console)({
        name: 'info-console',
        level: configLogging.level,
        colorize: true,
        timestamp: function() { return m.utc().format(dateFormat); }
      }),
      new (winston.transports.File)({
        name: 'warning-file',
        filename: 'warning-file.log',
        level: 'warning'
      }),
      new (winston.transports.File)({
        name: 'error-file',
        filename: 'error-file.log',
        level: 'error'
      })
    ]
  });

  logger.info('Starting logging service');
};

/**
 * Gets the logger instance
 * @returns {LoggerInstance} winLogger
 */
module.exports.get = function get() {
  return logger;
};

【问题讨论】:

  • 我建议手动创建具有写入权限的 error-file.log 和 warning-file.log 文件来测试 Winston 日志记录。如果它有效,则不是 Winston 问题,请为当前用户提供对您的应用所在目录的正确读/写/执行访问权限。
  • 我确实在我的本地计算机上测试了记录器,它工作正常,但由于某种原因它在服务器@mandar.gokhale 中无法正常工作

标签: node.js logging pm2 winston


【解决方案1】:

请创建一个 log.js 文件并编写所有代码

var winston = require('winston');
const env = process.env.NODE_ENV;
const logDir = 'logs';
const fs = require('fs');

if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir);
 }

const now = new Date();
var logger = new(winston.Logger)({
transports: [

    new winston.transports.File({
        name: 'error-file',
        filename: './logs/exceptions.log',
        level: 'error',
        json: false
    }),

    new(require('winston-daily-rotate-file'))({
        filename: `${logDir}/-apimodules.log`,
        timestamp: now,
        datePattern: 'dd-MM-yyyy',
        prepend: true,
        json: false,
        level: env === 'development' ? 'verbose' : 'info'
    })
],
exitOnError: false
});

module.exports = logger;
module.exports.stream = {
  write: function(message, encoding) {
    logger.info(message);
    console.log('message=', message);
  }
};

要添加日志,请在需要使用此代码记录的任何地方使用此文件

var logger = require('./path of/log.js');
logger.info('*** Requested for First log... ***');

【讨论】:

  • 虽然您的解决方案有效,但您没有解释它为什么有效。 :/ 知道会非常有用。
  • var logger = winston.createLogger({ 而不是 var logger = new(winston.Logger)({
  • 我也面临同样的问题。所以我根据您的解决方案更改了我的代码,但得到了解释的错误。当我使用 new(winston.Logger) 时,它给了我TypeError: winston.Logger is not a constructor 的错误。
【解决方案2】:

对于现代化,这里是上述答案的工作代码,因为上述答案不适用于最新版本的 winston 3.2.1。这是文件 log.js 的工作代码

const fs = require('fs');

var winston = require('winston');

const env = process.env.NODE_ENV;
const logDir = 'logs';

if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir);
}

const now = new Date();
var logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      name: 'error-file',
      filename: './logs/exceptions.log',
      level: 'error',
      json: false,
    }),

    new (require('winston-daily-rotate-file'))({
      filename: `${logDir}/-apimodules.log`,
      timestamp: now,
      datePattern: 'dd-MM-yyyy',
      prepend: true,
      json: false,
      level: env === 'development' ? 'verbose' : 'info',
    }),
  ],
  exitOnError: false,
});

module.exports = logger;

module.exports.stream = {
  write: function (message) {
    logger.info(message);
    console.log('message = ', message);
  },
};

请注意,这会将数据输出到名为 logs 的根文件夹。

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 2019-05-20
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多