【问题标题】:Node.js Winston loggingNode.js 温斯顿日志记录
【发布时间】:2014-01-19 18:12:42
【问题描述】:

在我的节点应用程序中,我使用“Winston”日志在单独的文件中打印错误。

我关注了this tutorial

当我尝试从其他文件访问记录器时......

我的代码:

var winston = require('winston');
var fs = require('fs');

fs.mkdir('./logs', function(err) {
    if (err) throw err;
});

// Define levels to be like log4j in java
var customLevels = {
  levels: {
    debug: 0,
    info: 1,
    warn: 2,
    error: 3
  },
  colors: {
    debug: 'blue',
    info: 'green',
    warn: 'yellow',
    error: 'red'
  }
};

// create the main logger
var logger = new(winston.Logger)({
    level: 'debug',
    levels: customLevels.levels,
    transports: [
        // setup console logging
        new(winston.transports.Console)({
            level: 'info', // Only write logs of info level or higher
            levels: customLevels.levels,
            colorize: true
        }),
        // setup logging to file
        new(winston.transports.File)({
            filename: './logs/project-debug.log',
            maxsize: 1024 * 1024 * 10, // 10MB
            level: 'debug',
            levels: customLevels.levels
        })
    ]
});

// create the data logger - I only log specific app output data here
var datalogger = new (winston.Logger) ({
    level: 'info',
    transports: [
        new (winston.transports.File) ({
            filename: './logs/project-data.log',
            maxsize: 1024 * 1024 * 10 // 10MB
        })
    ]
});

// make winston aware of your awesome colour choices
winston.addColors(customLevels.colors);

var Logging = function() {
    var loggers = {};

    // always return the singleton instance, if it has been initialised once already.
    if (Logging.prototype._singletonInstance) {
        return Logging.prototype._singletonInstance;
    }

    this.getLogger = function(name) {
        return loggers[name];
    }

    Logging.prototype.get = this.getLogger;

    loggers['project-debug.log'] = logger;
    loggers['project-data.log'] = datalogger;

    Logging.prototype._singletonInstance = this;
};

new Logging(); // I decided to force instantiation of the singleton logger here

logger.info('Logging set up OK!');

module.exports = Logging;

抛出错误:

Logging() is undefined.

【问题讨论】:

  • 您的logger var 未定义,这意味着.get('project-debug') 正在返回未定义或根本不返回。检查此方法是否符合您的预期。
  • 谢谢@Ivan Vergiliev ..我只是按照我提到的教程进行操作..我是这个 node.js 和 winston 世界的新手..所以我试图让我的代码工作得到..
  • re: 带有“new Logging;”的signleton,你也可以在构造函数闭包中使用单例实例,并在调用构造函数时检查它。
  • 谢谢@Zlatko ..现在我的问题是我无法将错误(捕获)传递给记录器...你有什么想法吗??
  • 您也可以发布该代码示例吗?

标签: node.js winston


【解决方案1】:

教程似乎有很多错误。我通过调用得到它的工作

var logger = logging.Logging().get('project-debug.log');

注意参数中的.log。该参数必须与loggers 数组中定义的名称之一匹配。

【讨论】:

  • 您可以将您的logging.js 文件发布在 gist 或类似内容中吗?我也必须在那里进行一些更改。
  • module.exports = Logging; 替换为 exports.Logging = Logging; - 如教程中所述。
  • 现在日志文件显示 {"level":"error","message":"","timestamp":"2014-01-02T13:08:23.880Z"},但是为什么没有出现错误消息??
  • 现在我的问题是我无法将 err(catch) 传递给记录器...你有什么想法吗?? ——
【解决方案2】:

我花了几个小时,这是我的解决方案:不要创建新的Logger,只需更改默认值即可。

创建一个模块lib/logger.js:

var logger = require('winston');
logger.setLevels({debug:0,info: 1,silly:2,warn: 3,error:4,});
logger.addColors({debug: 'green',info:  'cyan',silly: 'magenta',warn:  'yellow',error: 'red'});
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, { level: 'debug', colorize:true });
module.exports = logger;

app.js中使用:

var logger = require('./lib/log.js');  

从所有其他模块中使用:

var logger = require('winston');        

【讨论】:

  • 我知道这是旧的,我已经使用了你的解决方案。但我还有另一个问题。如何访问快速路由处理程序中的记录器 route("/route", (req, res)=>{ // 需要访问记录器 });?
【解决方案3】:

我使用了 winston 调试日志记录,但效果不佳。我遇到了类似的问题,有时它也会崩溃。我最近切换到 mopublish 团队使用的新模块。它还支持通过 morgan 进行的 http 日志记录。 NPM 模块 elogger - https://github.com/techunits/elogger

【讨论】:

    【解决方案4】:

    我创建并解释的文件:

    var winston = require('winston'),
        winstonRedis = require('winston-redis').Redis;
    
    // TR: console'da sadece hepsi tutuluyor olacak çünkü info log seviyesinden sonra diğer tüm log seviyeleri sıralanmış
    // EN: all log level will be shown in Console, because 'info' is on the top of list with 0 value.
    var transportConsole = new winston.transports.Console({ json: false, timestamp: true, prettyPrint:true, colorize: true, level:'info' }),
    
    // TR: File'da sadece i ve db tutuluyor olacak çünkü i den sonra db log seviyesi sıralanmış
    // EN: 'i' and 'db' log levels will be shown in File, because db is after i and for File transport level is 'i'
    transportFileDebug = new winston.transports.File({ filename: __dirname + '/debug.log', json: true }),
    transportFileException = new winston.transports.File({ filename: __dirname + '/exceptions.log', json: false }),
    
    // TR: rediste sadece db tutuluyor olacak çünkü db den sonra bir log seviyesi yok
    // EN: only 'db' will be stored in rediste because 'db' is the last one 
    transportRedis = new (winstonRedis)({host: '127.0.0.1', port: 6379, level:'db'});
    
    
    var logger = new (winston.Logger)({
        levels: {
            info: 0,
            warn: 1,
            error: 2,
            verbose: 3,
            i: 4,
            db: 5
        },
        transports: [
            transportConsole,
            transportFileDebug,
            transportRedis
        ],
        exceptionHandlers: [
            transportConsole,
            transportFileException
        ],
        exitOnError: false
    });
    
    winston.addColors({
        info: 'green',
        warn: 'cyan',
        error: 'red',
        verbose: 'blue',
        i: 'gray',
        db: 'magenta'
    });
    
    logger.i('iiiii foobar level-ed message');
    logger.db('dbbbbb foobar level-ed message');
    logger.info('infoo foobar level-ed message');
    logger.warn('warnnnn foobar level-ed message');
    logger.error('errroor foobar level-ed message');
    
    module.exports = logger;
    

    【讨论】:

      猜你喜欢
      • 2018-11-19
      • 1970-01-01
      • 2012-11-22
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多