Чи є швидкий спосіб навести Chrome для виведення часових міток в console.log
записи (як це робить Firefox). Або new Date().getTime()
передбачає єдиний варіант?
Чи є швидкий спосіб навести Chrome для виведення часових міток в console.log
записи (як це робить Firefox). Або new Date().getTime()
передбачає єдиний варіант?
Відповіді:
У Chrome є опція Налаштування консолі (Інструменти для розробників -> Консоль -> Налаштування [верхній правий кут]) під назвою "Показати часові позначки", саме це мені і потрібно.
Я щойно це знайшов. Не потрібні інші брудні хаки, які руйнують заповнювачі та стирають місце в коді, з якого були зареєстровані повідомлення.
Параметр "Показати часові позначки" переміщено на панель "Налаштування" "Налаштування DevTools", що знаходиться в правому верхньому куті ящика DevTools:
Спробуйте це:
console.logCopy = console.log.bind(console);
console.log = function(data)
{
var currentDate = '[' + new Date().toUTCString() + '] ';
this.logCopy(currentDate, data);
};
Або це, якщо вам потрібна мітка часу:
console.logCopy = console.log.bind(console);
console.log = function(data)
{
var timestamp = '[' + Date.now() + '] ';
this.logCopy(timestamp, data);
};
Щоб записати кілька речей і приємно (наприклад, представлення об'єктного дерева):
console.logCopy = console.log.bind(console);
console.log = function()
{
if (arguments.length)
{
var timestamp = '[' + Date.now() + '] ';
this.logCopy(timestamp, arguments);
}
};
З рядком формату ( JSFiddle )
console.logCopy = console.log.bind(console);
console.log = function()
{
// Timestamp to prepend
var timestamp = new Date().toJSON();
if (arguments.length)
{
// True array copy so we can call .splice()
var args = Array.prototype.slice.call(arguments, 0);
// If there is a format string then... it must
// be a string
if (typeof arguments[0] === "string")
{
// Prepend timestamp to the (possibly format) string
args[0] = "%o: " + arguments[0];
// Insert the timestamp where it has to be
args.splice(1, 0, timestamp);
// Log the whole array
this.logCopy.apply(this, args);
}
else
{
// "Normal" log
this.logCopy(timestamp, args);
}
}
};
Виходи з цим:
PS: Тестується лише в Chrome.
PPS: Array.prototype.slice
тут не є ідеальним, тому що він би записувався як масив об'єктів, а не як ряд цих.
Можна скористатися інструментами для розробників.
console.time('Timer name');
//do critical time stuff
console.timeEnd('Timer name');
"Назва таймера" має бути однаковою. Ви можете використовувати кілька примірників таймера з різними іменами.
console.timeStamp('foo')
він просто відображається як жовта точка на часовій шкалі. Мені це не спрацювало при використанні імен із пробілами Тхо.
console.log
з веденням лісозаготівлі, або взагалі ведення лісу
Я спочатку додав це як коментар, але хотів додати скріншот, оскільки принаймні одна людина не змогла знайти варіант (або, можливо, він не був доступний у їх конкретній версії чомусь).
На Chrome 68.0.3440.106 (а зараз це зареєстровано у 72.0.3626.121) мені довелося
Я перетворюю arguments
в Array, використовуючи Array.prototype.slice
так, щоб я міг concat
з іншим масивом того, що хочу додати, а потім передати його console.log.apply(console, /*here*/)
;
var log = function () {
return console.log.apply(
console,
['['+new Date().toISOString().slice(11,-5)+']'].concat(
Array.prototype.slice.call(arguments)
)
);
};
log(['foo']); // [18:13:17] ["foo"]
Здається, це теж arguments
можна Array.prototype.unshift
редагувати, але я не знаю, чи модифікувати його так, як це гарна ідея / матимуть інші побічні ефекти
var log = function () {
Array.prototype.unshift.call(
arguments,
'['+new Date().toISOString().slice(11,-5)+']'
);
return console.log.apply(console, arguments);
};
log(['foo']); // [18:13:39] ["foo"]
+new Date
і Date.now()
є альтернативними способами отримання часових позначок
Якщо ви користуєтеся браузером Google Chrome, ви можете використовувати хромовану консоль api:
Пройдений час між цими двома дзвінками відображається на консолі.
Щоб отримати детальну інформацію, перегляньте посилання на документ: https://developers.google.com/chrome-developer-tools/docs/console
З Chrome 68:
"Показати часові позначки" переміщено до налаштувань
Поставити прапорець Показувати часові позначки раніше в налаштуваннях консолі Налаштування консолі переміщено до Налаштування .
Спробуйте також:
this.log = console.log.bind( console, '[' + new Date().toUTCString() + ']' );
Ця функція ставить часові позначки, ім'я файлу та номер рядка як однакові вбудовані console.log
.
log
Створена таким чином функція заморожує фіксовану часову позначку; вам доведеться повторно запускати це кожен раз, коли вам потрібно оновити час [= актуальна дата; -]. Це можливо зробити цією функцією, але вам доведеться використовувати її як, mklog()(...)
а не log()
.
Якщо ви хочете зберегти інформацію про номер рядка (кожне повідомлення, що вказує на його .log () виклик, не все вказує на нашу обгортку), вам потрібно скористатися .bind()
. Ви можете додати додатковий аргумент часової позначки через, console.log.bind(console, <timestamp>)
але проблема полягає в тому, що вам потрібно повторно запускати це кожен раз, щоб отримати функцію, пов'язану зі свіжою міткою часу. Незручний спосіб це зробити - це функція, яка повертає пов'язану функцію:
function logf() {
// console.log is native function, has no .bind in some browsers.
// TODO: fallback to wrapping if .bind doesn't exist...
return Function.prototype.bind.call(console.log, console, yourTimeFormat());
}
який потім повинен використовуватися при подвійному дзвінку:
logf()(object, "message...")
Але ми можемо зробити перший виклик неявним шляхом встановлення властивості з функцією getter:
var origLog = console.log;
// TODO: fallbacks if no `defineProperty`...
Object.defineProperty(console, "log", {
get: function () {
return Function.prototype.bind.call(origLog, console, yourTimeFormat());
}
});
Тепер ви просто зателефонували console.log(...)
і автоматично це попереджає часову позначку!
> console.log(12)
71.919s 12 VM232:2
undefined
> console.log(12)
72.866s 12 VM233:2
undefined
Ви можете навіть домогтися цієї магічної поведінки просто, log()
а не console.log()
робити Object.defineProperty(window, "log", ...)
.
Дивіться https://github.com/pimterry/loglevel про добре виконану безпечну консольну обгортку з використанням.bind()
резервних копій сумісності.
Див. Https://github.com/eligrey/Xccessors, щоб отримати відповідні результати сумісності від defineProperty()
старого __defineGetter__
API. Якщо жоден API власності не працює, вам слід повернутись до функції обгортки, яка щоразу отримує свіжу мітку часу. (У цьому випадку ви втрачаєте інформацію про номер рядка, але часові позначки все одно відображатимуться.)
Бойлер: Час форматування так, як мені подобається:
var timestampMs = ((window.performance && window.performance.now) ?
function() { return window.performance.now(); } :
function() { return new Date().getTime(); });
function formatDuration(ms) { return (ms / 1000).toFixed(3) + "s"; }
var t0 = timestampMs();
function yourTimeFormat() { return formatDuration(timestampMs() - t0); }
Це додає функцію "log" до локальної області (використовуючи this
), використовуючи стільки аргументів, скільки потрібно:
this.log = function() {
var args = [];
args.push('[' + new Date().toUTCString() + '] ');
//now add all the other arguments that were passed in:
for (var _i = 0, _len = arguments.length; _i < _len; _i++) {
arg = arguments[_i];
args.push(arg);
}
//pass it all into the "real" log function
window.console.log.apply(window.console, args);
}
Таким чином, ви можете використовувати його:
this.log({test: 'log'}, 'monkey', 42);
Виходить приблизно так:
[Пн, 11 березня 2013 16:47:49 GMT] Об’єкт {test: "log"} мавпа 42
також розширив дуже приємне рішення "з форматним рядком" від JSmyth, щоб також підтримати
console.log
варіації ( log
, debug
, info
, warn
,error
)09:05:11.518
проти2018-06-13T09:05:11.518Z
)console
якщо його функції не існують у браузерах.
var Utl = {
consoleFallback : function() {
if (console == undefined) {
console = {
log : function() {},
debug : function() {},
info : function() {},
warn : function() {},
error : function() {}
};
}
if (console.debug == undefined) { // IE workaround
console.debug = function() {
console.info( 'DEBUG: ', arguments );
}
}
},
/** based on timestamp logging: from: https://stackoverflow.com/a/13278323/1915920 */
consoleWithTimestamps : function( getDateFunc = function(){ return new Date().toJSON() } ) {
console.logCopy = console.log.bind(console)
console.log = function() {
var timestamp = getDateFunc()
if (arguments.length) {
var args = Array.prototype.slice.call(arguments, 0)
if (typeof arguments[0] === "string") {
args[0] = "%o: " + arguments[0]
args.splice(1, 0, timestamp)
this.logCopy.apply(this, args)
} else this.logCopy(timestamp, args)
}
}
console.debugCopy = console.debug.bind(console)
console.debug = function() {
var timestamp = getDateFunc()
if (arguments.length) {
var args = Array.prototype.slice.call(arguments, 0)
if (typeof arguments[0] === "string") {
args[0] = "%o: " + arguments[0]
args.splice(1, 0, timestamp)
this.debugCopy.apply(this, args)
} else this.debugCopy(timestamp, args)
}
}
console.infoCopy = console.info.bind(console)
console.info = function() {
var timestamp = getDateFunc()
if (arguments.length) {
var args = Array.prototype.slice.call(arguments, 0)
if (typeof arguments[0] === "string") {
args[0] = "%o: " + arguments[0]
args.splice(1, 0, timestamp)
this.infoCopy.apply(this, args)
} else this.infoCopy(timestamp, args)
}
}
console.warnCopy = console.warn.bind(console)
console.warn = function() {
var timestamp = getDateFunc()
if (arguments.length) {
var args = Array.prototype.slice.call(arguments, 0)
if (typeof arguments[0] === "string") {
args[0] = "%o: " + arguments[0]
args.splice(1, 0, timestamp)
this.warnCopy.apply(this, args)
} else this.warnCopy(timestamp, args)
}
}
console.errorCopy = console.error.bind(console)
console.error = function() {
var timestamp = getDateFunc()
if (arguments.length) {
var args = Array.prototype.slice.call(arguments, 0)
if (typeof arguments[0] === "string") {
args[0] = "%o: " + arguments[0]
args.splice(1, 0, timestamp)
this.errorCopy.apply(this, args)
} else this.errorCopy(timestamp, args)
}
}
}
} // Utl
Utl.consoleFallback()
//Utl.consoleWithTimestamps() // defaults to e.g. '2018-06-13T09:05:11.518Z'
Utl.consoleWithTimestamps( function(){ return new Date().toJSON().replace( /^.+T(.+)Z.*$/, '$1' ) } ) // e.g. '09:05:11.518'
Utl.js
вище . тому включення (коментування на вимогу / Utl.consoleWithTimestamps(...)
вхід / вихід) переходу-override може мати сенс
Рішення ES6:
const timestamp = () => `[${new Date().toUTCString()}]`
const log = (...args) => console.log(timestamp(), ...args)
де timestamp()
повертається фактично відформатована часова марка і log
додається часова марка і поширюється всі власні аргументиconsole.log
Уточнення відповіді Дж. Сміта:
console.logCopy = console.log.bind(console);
console.log = function()
{
if (arguments.length)
{
var timestamp = new Date().toJSON(); // The easiest way I found to get milliseconds in the timestamp
var args = arguments;
args[0] = timestamp + ' > ' + arguments[0];
this.logCopy.apply(this, args);
}
};
Це:
.log
console.log(document, window)
, тобто без припущення про рядок формату, ви отримаєте smth. наприклад, 2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}
замість того, щоб document
бути представленим як дерево об'єктів, що розширюється.