Подтвердить что ты не робот

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

У меня есть полный, развернутый, основанный на Express проект, с множеством инструкций console.log() и console.error(). Проект выполняется навсегда, направляя stdout и stderr в 2 отдельных файла.

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

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

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

4b9b3361

Ответ 1

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

Для записи я установил штамп консоли модуля (npm install console-stamp --save) и добавил эту строку в начало app.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
...

Ответ 2

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

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);

Ответ 3

модуль: "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

Ответ 4

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

Ответ 5

Если вам нужно решение без другой внешней зависимости, но вы хотите сохранить полные функции console.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

Ответ 6

app.use(morgan('[:date[web]] :method :url :status :res[content-length] - :remote-addr - :response-time ms'))

Ответ 7

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

Ответ 9

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

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 );
};

Ответ 10

Используйте слушатель событий, как это,

process.on('error', function() { 
   console.log('Error Occurred.');

   var d = Date(Date.now()).toString();
   console.log.call(console, d); // Wed Aug 07 2019 23:40:07 GMT+0100 (GMT+01:00)
});

счастливого кодирования :)