часові позначки console.log в Chrome?


235

Чи є швидкий спосіб навести Chrome для виведення часових міток в console.logзаписи (як це робить Firefox). Або new Date().getTime()передбачає єдиний варіант?


1
чи можете ви змінити прийняту відповідь? Другий за голосування набагато простіше.
Лірон Ягдав

Схоже, Chrome змінив, як увімкнути це. Дивіться, github.com/Microsoft/vscode/isissue/61298#issuecomment-431422747
itsthetaste

Відповіді:


425

У Chrome є опція Налаштування консолі (Інструменти для розробників -> Консоль -> Налаштування [верхній правий кут]) під назвою "Показати часові позначки", саме це мені і потрібно.

Я щойно це знайшов. Не потрібні інші брудні хаки, які руйнують заповнювачі та стирають місце в коді, з якого були зареєстровані повідомлення.

Оновлення для Chrome 68+

Параметр "Показати часові позначки" переміщено на панель "Налаштування" "Налаштування DevTools", що знаходиться в правому верхньому куті ящика DevTools:

введіть тут опис зображення


3
Як зазначав @Krzysztof Wolny, тепер це вбудований Chrome 35 DevTools. (Так!) Увімкніть, відкривши інструменти для розробників (наприклад, F12 або "Перевірити елемент"), натисніть на "шестірню", щоб переглянути налаштування, а потім встановіть прапорець "Показати часові позначки" в розділі "Консоль". ! Увімкнути налаштування часових позначок у devtools twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/… codereview.chromium.org/185713007
iX3

1
Чи є спосіб використовувати шаблон для позначки часу в Chrome? Мені потрібні лише година і хвилина.
Гусь

31
У Chrome 68.0.3440.106 мені довелося відкрити інструменти розробки (F12)> натиснути триточне меню у верхньому правому куті> натиснути налаштування> вибрати Налаштування в лівому меню> Перевірити показ часових позначок у розділі Консоль екрана налаштувань (угорі праворуч )
tekiegirl

5
70.0.3538.110 (Офіційна збірка) (64-розрядна) Ця відповідь колись спрацювала для мене: тобто консоль "значок шестірні"; Галочка "Показати часові позначки" ... але тепер я не бачу "Показати часові позначки" в Chrome 70.0.3538.110 (Офіційна збірка) (64-розрядна). Тому я спробував пропозицію @ tekiegirl щодо: Chrome 68: тобто інструменти відкритого розробника (F12 )> натисніть меню з трьома точками вгорі праворуч> натисніть Налаштування> виберіть Налаштування в меню ліворуч> Позначте часові позначки "Показувати" ... але я не бачу "Налаштування" у лівому меню Налаштування 70.0.3538.110 (Офіційна збірка ) (64-бітний)
Червоний горох

2
Дякую @tekiegirl, погодься, твоя відповідь вирішує мою проблему! Тобто, користувачі Chrome 68+ повинні змінити налаштування DevTools (проти шухляди для швидких налаштувань консолі ) .в налаштуваннях DevTools, вкладці "Налаштування", заголовку "Консоль"; Ви знайдете прапорець "Показати часові позначки".
Червоний горох

81

Спробуйте це:

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тут не є ідеальним, тому що він би записувався як масив об'єктів, а не як ряд цих.


Перепишіть оператор журналу, щоб прекрасно відображати об’єкти в консолі Chrome, попередня версія просто показувала "[object Object]" або подібну.
JSmyth

@Neal, звичайно , це не робить - ви повинні продовжити його (; Ви можете зробити що - щось на зразок цього
JSmyth

Це не спрацює в загальному випадку, коли перший аргумент для входу - це рядок формату
blueFast

@gonvaled видалив мій коментар, оскільки це насправді не мало сенсу - відсутність кави в крові. Ви правильно, цей зразок коду не передбачає специфікаторів формату. Я думаю, ми можемо вийти на кінцівку і перевірити наявність специфікаторів рядка формату, виходячи з цього, що дають різні результати.
JSmyth

Будь-який спосіб красиво обробити нові лінії? Багаторядкове повідомлення відображається на декількох рядках хромом, але коли в рядку, воно стає одним довгим рядком із символом ↵.
Дан Даскалеску

20

Можна скористатися інструментами для розробників.

console.time('Timer name');
//do critical time stuff
console.timeEnd('Timer name');

"Назва таймера" має бути однаковою. Ви можете використовувати кілька примірників таймера з різними іменами.


Там же console.timeStamp('foo')він просто відображається як жовта точка на часовій шкалі. Мені це не спрацювало при використанні імен із пробілами Тхо.
Vitim.us

це не дає відповіді на запитання, пов’язані console.logз веденням лісозаготівлі, або взагалі ведення лісу
Андреас Дітріх

@AndreasDietrich чому б і ні? Він робить вихід на консоль. Більше про це на цьому веб-сайті блогу 2013.m.m.ususchulz.com/2013/11/22/…
JP Hellemons

18

Я спочатку додав це як коментар, але хотів додати скріншот, оскільки принаймні одна людина не змогла знайти варіант (або, можливо, він не був доступний у їх конкретній версії чомусь).

На Chrome 68.0.3440.106 (а зараз це зареєстровано у 72.0.3626.121) мені довелося

  • відкриті інструменти для розробників (F12)
  • натисніть на триточне меню вгорі праворуч
  • натисніть Налаштування
  • виберіть Налаштування в лівому меню
  • перевірте показ часових позначок у розділі Консоль на екрані налаштувань

Налаштування> Налаштування> Консоль> Показати часові позначки


7

Я перетворюю 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"]

6

+new Dateі Date.now()є альтернативними способами отримання часових позначок


Дякую, +1, але я сподівався, що для цього може бути підтримка без додавання коду.
UpTheCreek

6

Якщо ви користуєтеся браузером Google Chrome, ви можете використовувати хромовану консоль api:

  • console.time: зателефонуйте їй у точку коду, де ви хочете запустити таймер
  • console.timeEnd: зателефонуйте, щоб зупинити таймер

Пройдений час між цими двома дзвінками відображається на консолі.

Щоб отримати детальну інформацію, перегляньте посилання на документ: https://developers.google.com/chrome-developer-tools/docs/console


Щоб трохи розширити цю проблему для таких, як я, занадто ліниво піти і подивитися. Правильне використання: console.time ("мій мір"); [код, який ви хочете вчасно] console.timeEnd ("мій захід");
Саміх

це не відповідає на питання, пов’язані з console.log або взагалі веденням журналу
Андреас Дітріх

6

З Chrome 68:

"Показати часові позначки" переміщено до налаштувань

Поставити прапорець Показувати часові позначки раніше в налаштуваннях консолі Налаштування консолі переміщено до Налаштування .

введіть тут опис зображення


2
@ відповідь tekiegirl містить скріншот, на якому вказано, де знайти прапорець у налаштуваннях DevTools; знімок екрана в цій відповіді не показує мені, де знайти прапорець "Показати часові позначки".
Червоний горох

4

Спробуйте також:

this.log = console.log.bind( console, '[' + new Date().toUTCString() + ']' );

Ця функція ставить часові позначки, ім'я файлу та номер рядка як однакові вбудовані console.log.


Created logСтворена таким чином функція заморожує фіксовану часову позначку; вам доведеться повторно запускати це кожен раз, коли вам потрібно оновити час [= актуальна дата; -]. Це можливо зробити цією функцією, але вам доведеться використовувати її як, mklog()(...)а не log().
Бені Чернявський-Паскін

3

Якщо ви хочете зберегти інформацію про номер рядка (кожне повідомлення, що вказує на його .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); }

2

Це додає функцію "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


2

також розширив дуже приємне рішення "з форматним рядком" від 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'

недолік , однак, що (наприклад , в FF 56.0) він не вказує місцезнаходження джерела журналу заяву, але один з Utl.jsвище . тому включення (коментування на вимогу / Utl.consoleWithTimestamps(...)вхід / вихід) переходу-override може мати сенс
Андреас Дітріх

1

У мене це є в більшості програм Node.JS. Він також працює в браузері.

function log() {
  const now = new Date();
  const currentDate = `[${now.toISOString()}]: `;
  const args = Array.from(arguments);
  args.unshift(currentDate);
  console.log.apply(console, args);
}

1

Рішення ES6:

const timestamp = () => `[${new Date().toUTCString()}]`
const log = (...args) => console.log(timestamp(), ...args)

де timestamp()повертається фактично відформатована часова марка і logдодається часова марка і поширюється всі власні аргументиconsole.log


1
Будь ласка,
уточнюйте, даючи

Дякую @YatinKhullar Я змінив свою відповідь.
А. Рокинський

0

Уточнення відповіді Дж. Сміта:

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бути представленим як дерево об'єктів, що розширюється.
JSmyth

Дивіться тут, де я намагався знайти рішення питання, яке ви порушили (також оновив мою відповідь, хоча передчасно).
JSmyth

@JSmyth: впевнений, саме тому одна з вимог мого уточнення полягає в тому, що перший аргумент - це рядковий формат. Щоб зробити його гнучким, ймовірно, буде достатньо перевірки першого аргументу на рядок.
blueFast
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.