Node.js Winston ведение журнала

В моем приложении узла я использую "Winston" Logging, чтобы распечатать ошибки в отдельном файле.

Я подписался на это руководство.

Когда я пытался получить доступ к регистратору из других файлов ....

Мой код:

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.

person Subburaj    schedule 02.01.2014    source источник
comment
Ваш logger var не определен, что означает, что .get('project-debug') возвращает значение undefined или вообще не возвращается. Проверьте, выполняет ли этот метод то, что вы от него ожидаете.   -  person Ivan Vergiliev    schedule 02.01.2014
comment
Спасибо, @Ivan Vergiliev .. Я просто следую инструкциям, о которых я упомянул .. Я новичок в этом node.js и мире Winston .. Так что я пытаюсь заставить работать код, который у меня есть ..   -  person Subburaj    schedule 02.01.2014
comment
re: signleton с новым Logging ;, вы также можете использовать экземпляр singleton в закрытии конструктора и проверять его при вызове конструктора.   -  person Zlatko    schedule 02.01.2014
comment
Спасибо @Zlatko .. Теперь моя проблема в том, что я не могу передать ошибку (уловку) регистратору ... У вас есть какие-нибудь идеи ??   -  person Subburaj    schedule 02.01.2014
comment
Можете ли вы опубликовать и этот образец кода?   -  person Zlatko    schedule 03.01.2014
comment
У меня тоже были с этим головные боли. См. использование Winston   -  person akrsmv    schedule 28.02.2016


Ответы (4)


Похоже, что в руководстве есть несколько ошибок. Я получил его, позвонив

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

Обратите внимание на .log в аргументе. Аргумент должен соответствовать одному из имен, определенных в массиве loggers.

person Ivan Vergiliev    schedule 02.01.2014
comment
Можете ли вы опубликовать свой logging.js файл в виде содержания или чего-то подобного? Пришлось и там внести некоторые изменения. - person Ivan Vergiliev; 02.01.2014
comment
Замените module.exports = Logging; на exports.Logging = Logging; - как в учебнике. - person Ivan Vergiliev; 02.01.2014
comment
Теперь в файле журнала отображается {level: error, message:, timestamp: 2014-01-02T13: 08: 23.880Z}, но сообщение об ошибке не появляется, почему ?? - person Subburaj; 02.01.2014
comment
Теперь моя проблема в том, что я не могу передать ошибку (уловку) регистратору ... У вас есть какие-нибудь идеи ?? - - person Subburaj; 02.01.2014

Я потратил на это несколько часов, вот мое решение: не создавать новый 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');        
person user3575777    schedule 27.04.2014
comment
Я знаю, что это старый, и я использовал ваше решение. Но у меня осталась другая проблема. Как мне получить доступ к регистратору внутри экспресс-обработчика маршрута route (/ route, (req, res) = ›{// нужен доступ к регистратору}) ;? - person smellyarmpits; 07.04.2017

Файл, который я создал и объяснил:

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;
person uzay95    schedule 20.02.2015

Я использовал ведение журнала отладки Winston, но это не так эффективно. Я столкнулся с подобными проблемами, и иногда он падал. Недавно я перешел на новый модуль, которым пользуется команда mopublish. Замечательно также поддерживать ведение журнала http через morgan. Модуль elogger NPM - https://github.com/techunits/elogger

person Sougata Pal    schedule 01.01.2015