Добавление меток времени во все сообщения консоли


меня, развернуть, экспресс-проект, со многими консоли.log () и консоль.ошибка() отчетности. Проект запускается с использованием forever, направляя stdout и stderr в 2 отдельных файла.

все это работает довольно хорошо, но теперь мне не хватает временных меток - чтобы точно знать, когда произошли ошибки.

Я могу сделать какой-то поиск/замену во всем моем коде или использовать какой-то модуль npm, который переопределяет консоль в каждом файле, но я не хочу чтобы коснуться каждого файла модели / маршрута, если мне абсолютно не нужно.

есть ли способ, возможно, Экспресс-промежуточное программное обеспечение, которое позволит мне добавлять метку времени к каждому выполненному вызову, или мне нужно вручную добавить его?

9 68

9 ответов:

получается, ты можете переопределить функции консоли в верхней части приложения.JS-файл, и он вступит в силу в каждом другом модуле. Я получил смешанные результаты, потому что один из моих модулей раздвоен как child_process. Как только я скопировал строку в верхнюю часть этого файла, все работает.

для записи я установил модуль console-stamp (npm install console-stamp --save), и добавил эту строку в верхней части приложения.js и childProcess.js:

// add timestamps in front of log messages
require('console-stamp')(console, '[HH:MM:ss.l]');

моя проблема теперь была в том, что :date формат регистратора подключения использует формат UTC, а не тот, который я использую в других вызовах консоли. Это было легко исправлено путем регистрации моего собственного формата времени (и как побочный эффект, требующий dateformat модуль console stamp поставляется с, а не устанавливать другой):

// since logger only returns a UTC version of date, I'm defining my own date format - using an internal module from console-stamp
express.logger.format('mydate', function() {
    var df = require('console-stamp/node_modules/dateformat');
    return df(new Date(), 'HH:MM:ss.l');
});
app.use(express.logger('[:mydate] :method :url :status :res[content-length] - :remote-addr - :response-time ms'));

теперь мои файлы журнала выглядят организованными (а еще лучше, разборчивыми):

[15:09:47.746] staging server listening on port 3000
[15:09:49.322] connected to database server xxxxx successfully
[15:09:52.743] GET /product 200 - - 127.0.0.1 - 214 ms
[15:09:52.929] GET /stylesheets/bootstrap-cerulean.min.css 304 - - 127.0.0.1 - 8 ms
[15:09:52.935] GET /javascripts/vendor/require.js 304 - - 127.0.0.1 - 3 ms
[15:09:53.085] GET /javascripts/product.js 304 - - 127.0.0.1 - 2 ms
...

создайте файл со следующим:

var log = console.log;

console.log = function(){
  log.apply(console, [Date.now()].concat(arguments));
};

требуйте его в своем приложении, прежде чем регистрировать что-либо. Сделайте то же самое для console.error при необходимости.

обратите внимание, что это решение уничтожит переменной вставки (console.log("he%s", "y") // "hey") Если вы используете это. Если вам это нужно, просто сначала запишите метку времени:

log.call(console, Date.now());
log.apply(console, arguments);

вы также можете использовать log-timestamp пакета. Это довольно просто, и настраиваемый, а также.

Если вы хотите решение без другой внешней зависимости, но вы хотите сохранить все функциональные возможности консоли.log (несколько параметров, вставка переменных) вы можете использовать следующий код:

var log = console.log;

console.log = function () {
    var first_parameter = arguments[0];
    var other_parameters = Array.prototype.slice.call(arguments, 1);

    function formatConsoleDate (date) {
        var hour = date.getHours();
        var minutes = date.getMinutes();
        var seconds = date.getSeconds();
        var milliseconds = date.getMilliseconds();

        return '[' +
               ((hour < 10) ? '0' + hour: hour) +
               ':' +
               ((minutes < 10) ? '0' + minutes: minutes) +
               ':' +
               ((seconds < 10) ? '0' + seconds: seconds) +
               '.' +
               ('00' + milliseconds).slice(-3) +
               '] ';
    }

    log.apply(console, [formatConsoleDate(new Date()) + first_parameter].concat(other_parameters));
};

вы можете изменить функцию formatConsoleDate для форматирования даты, как вы хотите.

этот код должен быть написан только один раз поверх вашего основного файла JavaScript.

console.log("he%s", "y") напечатает что-то вроде этого:

[12:22:55.053] hey

модуль: "log-timestamp" работает для меня.

посмотреть https://www.npmjs.com/package/log-timestamp

npm install log-timestamp

прост в использовании

console.log('Before log-timestamp');
require('log-timestamp');
console.log('After log-timestamp');

результат

Before log-timestamp
[2012-08-23T20:08:32.000Z] After log-timestamp
app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))

Это не прямой ответ, но вы смотрели на Уинстона.Джей? Он имеет тонну больше вариантов ведения журнала, включая ведение журнала в файл json или базу данных. Они всегда имеют метки времени по умолчанию. Всего лишь мысль.

вы можете использовать функцию util.log от https://nodejs.org/api/util.html.

эта реализация проста, поддерживает оригинальную функциональность консоли.журнал (передача одного объекта и подстановка переменных), не использует внешние модули и печатает все в одном вызове консоли.журнал:

var origlog = console.log;

console.log = function( obj, ...placeholders ){
    if ( typeof obj === 'string' )
        placeholders.unshift( Date.now() + " " + obj );
    else
    {
        // This handles console.log( object )
        placeholders.unshift( obj );
        placeholders.unshift( Date.now() + " %j" );
    }

    origlog.apply( this, placeholders );
};