Добавление меток времени во все сообщения консоли
меня, развернуть, экспресс-проект, со многими консоли.log () и консоль.ошибка() отчетности. Проект запускается с использованием forever, направляя stdout и stderr в 2 отдельных файла.
все это работает довольно хорошо, но теперь мне не хватает временных меток - чтобы точно знать, когда произошли ошибки.
Я могу сделать какой-то поиск/замену во всем моем коде или использовать какой-то модуль npm, который переопределяет консоль в каждом файле, но я не хочу чтобы коснуться каждого файла модели / маршрута, если мне абсолютно не нужно.
есть ли способ, возможно, Экспресс-промежуточное программное обеспечение, которое позволит мне добавлять метку времени к каждому выполненному вызову, или мне нужно вручную добавить его?
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 ); };