Znaczniki czasu console.log w Chrome?

235

Czy istnieje jakiś szybki sposób, aby Chrome wyświetlał znaczniki czasu podczas console.logzapisywania (podobnie jak Firefox). Czy też new Date().getTime()przygotowywanie jedynej opcji?

UpTheCreek
źródło
1
czy możesz zmienić przyjętą odpowiedź? Drugi najczęściej wybierany jest znacznie prostszy.
Liron Yahdav
Wygląda na to, że Chrome zmienił sposób włączania tego. Zobacz, github.com/Microsoft/vscode/issues/61298#issuecomment-431422747
itsthetaste

Odpowiedzi:

425

W Chrome dostępna jest opcja Ustawienia konsoli (Narzędzia dla programistów -> Konsola -> Ustawienia [prawy górny róg]) o nazwie „Pokaż znaczniki czasu”, co jest dokładnie tym, czego potrzebowałem.

Właśnie to znalazłem. Nie są potrzebne żadne inne brudne włamania, które niszczą symbole zastępcze i usuwają miejsce w kodzie, z którego wiadomości zostały zarejestrowane.

Aktualizacja dla Chrome 68+

Ustawienie „Pokaż znaczniki czasu” zostało przeniesione do panelu Preferencje w „Ustawieniach DevTools”, znajdującym się w prawym górnym rogu szuflady DevTools:

wprowadź opis zdjęcia tutaj

Krzysztof Wolny
źródło
3
Jak zauważył @Krzysztof Wolny, jest to teraz wbudowane w Chrome 35 DevTools. (Tak!) Włącz, otwierając narzędzia programistyczne (np. F12 lub „Sprawdź element”), kliknij „koło zębate”, aby wyświetlić ustawienia, a następnie zaznacz pole wyboru „Pokaż znaczniki czasu” w sekcji „Konsola”. ! Włącz ustawienie znaczników czasu w devtools twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/… codereview.chromium.org/185713007
iX3
1
Czy istnieje sposób użycia wzorca znacznika czasu w Chrome? Potrzebuję tylko godziny i minuty.
Guus
31
W Chrome 68.0.3440.106 musiałem otworzyć narzędzia programistyczne (F12)> kliknąć menu z trzema kropkami w prawym górnym rogu> kliknąć Ustawienia> wybrać Preferencje w lewym menu> zaznaczyć pokaż znaczniki czasu w sekcji Konsola ekranu ustawień (w prawym górnym rogu )
tekiegirl
5
70.0.3538.110 (oficjalna wersja) (64-bit) Ta odpowiedź kiedyś mi odpowiadała: tzn. „Ikona koła zębatego”; Znacznik wyboru „Pokaż znaczniki czasu” ... ale teraz nie widzę „Pokaż znaczniki czasu” w Chrome 70.0.3538.110 (oficjalna wersja) (64-bit) Więc wypróbowałem sugestię @ tekiegirl: Chrome 68: tzn. Otwórz narzędzia deweloperskie (F12 )> kliknij menu z trzema kropkami w prawym górnym rogu> kliknij ustawienia> wybierz Preferencje w menu po lewej stronie> Sprawdź występów znaczników czasu ... ale ja nie patrz „Preferencje” w lewym menu ustawienia 70.0.3538.110 (Dziennik budowy ) (64-bit)
The Red Pea
2
Dzięki @tekiegirl, zgadzam się, twoja odpowiedź rozwiązuje mój problem! Oznacza to, że użytkownicy Chrome 68+ muszą zmienić ustawienia DevTools (w stosunku do szuflady dla szybkich ustawień konsoli ). W ustawieniach DevTools, zakładka „Preferencje”, nagłówek „Konsola”; znajdziesz pole wyboru „Pokaż znaczniki czasu”.
The Red Pea
81

Spróbuj tego:

console.logCopy = console.log.bind(console);

console.log = function(data)
{
    var currentDate = '[' + new Date().toUTCString() + '] ';
    this.logCopy(currentDate, data);
};



Lub to, jeśli chcesz znacznik czasu:

console.logCopy = console.log.bind(console);

console.log = function(data)
{
    var timestamp = '[' + Date.now() + '] ';
    this.logCopy(timestamp, data);
};



Aby zarejestrować więcej niż jedną rzecz i ładnie (np. Reprezentacja drzewa obiektów):

console.logCopy = console.log.bind(console);

console.log = function()
{
    if (arguments.length)
    {
        var timestamp = '[' + Date.now() + '] ';
        this.logCopy(timestamp, arguments);
    }
};



Z ciągiem formatu ( 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);
        }
    }
};


Wytwarza z tym:

Próbka wyjściowa

PS: Testowane tylko w Chrome.

PPS: Array.prototype.slicenie jest tutaj idealny, ponieważ byłby rejestrowany jako tablica obiektów, a nie szereg.

JSmyth
źródło
Zmieniono instrukcję dziennika, aby wyświetlać obiekty w konsoli Chrome w piękny sposób, poprzednia wersja po prostu pokazywała „[obiekt obiektowy]” lub coś w tym rodzaju.
JSmyth,
@Neal, oczywiście, że nie - trzeba go (przedłużyć; można coś zrobić jak ten
JSmyth
Nie zadziała to w ogólnym przypadku, gdy pierwszym argumentem do zalogowania jest ciąg formatu
blueFast
@gonvaled usunął mój komentarz, ponieważ to naprawdę nie miało sensu - brak kawy we krwi. Masz rację, ten przykładowy kod nie zakłada specyfikatorów formatu. Myślę, że możemy wyjść tutaj na kończynę i sprawdzić specyfikatory ciągu formatu, w oparciu o które dają różne wyniki.
JSmyth
Jakiś sposób ładnie obsługiwać nowe linie ? Wiadomość wielowierszowa jest wyświetlana w wielu wierszach przez chrom, ale gdy jest w ciągu, staje się jedną długą linią ze znakiem ↵.
Dan Dascalescu
20

Możesz użyć narzędzia do tworzenia profilów dla programistów.

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

„Nazwa timera” musi być taka sama. Możesz użyć wielu wystąpień timera o różnych nazwach.

SerzN1
źródło
Pojawia się również console.timeStamp('foo')jako żółty punkt na osi czasu. Nie działało to dla mnie przy użyciu nazw ze spacjami.
Vitim.us
to nie odpowiada na pytanie związane console.loglub logowania
Andreas Dietrich,
@AndreasDietrich, dlaczego nie? Wysyła dane do konsoli. Więcej na ten temat na blogu 2013 blog.mariusschulz.com/2013/11/22/…
JP Hellemons,
18

Pierwotnie dodałem to jako komentarz, ale chciałem dodać zrzut ekranu, ponieważ co najmniej jedna osoba nie mogła znaleźć opcji (a może z jakiegoś powodu nie była dostępna w ich konkretnej wersji).

W Chrome 68.0.3440.106 (a teraz zalogowany w 72.0.3626.121) musiałem

  • narzędzia open dev (F12)
  • kliknij menu z trzema kropkami w prawym górnym rogu
  • kliknij ustawienia
  • wybierz Preferencje w menu po lewej stronie
  • zaznacz opcję pokaż znaczniki czasu w sekcji Konsola na ekranie ustawień

Ustawienia> Preferencje> Konsola> Pokaż znaczniki czasu

tekiegirl
źródło
7

Konwertuję argumentsna Array za pomocą, Array.prototype.sliceaby móc concatz innym Array tego, co chcę dodać, a następnie przekazać do 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"]

Wydaje się, że argumentsmożna to Array.prototype.unshiftrównież edytować, ale nie wiem, czy modyfikowanie go w ten sposób jest dobrym pomysłem / będzie miało inne skutki uboczne

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"]
Paul S.
źródło
6

+new Datei Date.now()są alternatywnymi sposobami uzyskiwania znaczników czasu

KiL
źródło
Dzięki, +1, ale miałem nadzieję, że może to być wsparcie bez konieczności dodawania kodu.
UpTheCreek,
6

Jeśli używasz przeglądarki Google Chrome, możesz użyć interfejsu API konsoli Chrome:

  • console.time: wywołaj go w punkcie kodu, w którym chcesz uruchomić stoper
  • console.timeEnd: wywołaj go, aby zatrzymać stoper

Czas, jaki upłynął między tymi dwoma połączeniami, jest wyświetlany w konsoli.

Aby uzyskać szczegółowe informacje, zobacz link do dokumentu: https://developers.google.com/chrome-developer-tools/docs/console

Ian Jiang
źródło
Rozwijam to trochę dla tych, którzy są zbyt leniwi, by pójść i poszukać. Prawidłowe użycie to: console.time („myMeasure”); [kod, który chcesz czas] console.timeEnd („myMeasure”);
Samih
to nie odpowiada na pytanie związane z console.log lub logowaniem w ogóle
Andreas Dietrich
6

Z Chrome 68:

„Pokaż znaczniki czasu” przeniesiono do ustawień

Pole wyboru Pokaż znaczniki czasu poprzednio w Ustawieniach konsoli Ustawienia konsoli zostały przeniesione do Ustawień .

wprowadź opis zdjęcia tutaj

itsazzad
źródło
2
Odpowiedź @ tekiegirl zawiera zrzut ekranu pokazujący, gdzie znaleźć pole wyboru w Ustawieniach DevTools; zrzut ekranu w tej odpowiedzi nie pokazuje mi, jak znaleźć pole wyboru „Pokaż znaczniki czasu”.
The Red Pea
4

Spróbuj również:

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

Ta funkcja umieszcza znacznik czasu, nazwę pliku i numer wiersza tak samo jak wbudowany console.log.

sho terunuma
źródło
Created logUtworzona w ten sposób funkcja zawiesza stały znacznik czasu; będziesz musiał ponownie uruchomić to za każdym razem, gdy chcesz mieć aktualny czas [= aktualna data; -]. Można to uczynić funkcją, ale trzeba by jej używać jak mklog()(...)zamiast log().
Beni Cherniavsky-Paskin
3

Jeśli chcesz zachować informacje o numerze linii (każdy komunikat wskazujący na jego wywołanie .log (), a nie wszystkie wskazujące na nasze opakowanie), musisz użyć .bind(). Możesz wstawić dodatkowy argument znacznika czasu za pomocą, console.log.bind(console, <timestamp>)ale problem polega na tym, że musisz go ponownie uruchomić za każdym razem, aby uzyskać funkcję związaną ze świeżym znacznikiem czasu. Niezręcznym sposobem na to jest funkcja, która zwraca funkcję powiązaną:

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

który następnie musi być użyty z podwójnym wywołaniem:

logf()(object, "message...")

ALE możemy wykonać pierwsze połączenie niejawnie, instalując właściwość z funkcją getter:

var origLog = console.log;
// TODO: fallbacks if no `defineProperty`...
Object.defineProperty(console, "log", {
  get: function () { 
    return Function.prototype.bind.call(origLog, console, yourTimeFormat()); 
  }
});

Teraz po prostu zadzwoń console.log(...)i automatycznie przygotuje znacznik czasu!

> console.log(12)
71.919s 12 VM232:2
undefined
> console.log(12)
72.866s 12 VM233:2
undefined

Możesz nawet osiągnąć to magiczne zachowanie za pomocą prostego log()zamiast console.log()robić Object.defineProperty(window, "log", ...).


Zobacz https://github.com/pimterry/loglevel, aby zapoznać się z dobrze wykonanym bezpiecznym owijaniem konsoli .bind()z obsługą błędów zgodności.

Zobacz https://github.com/eligrey/Xccessors, aby zapoznać się z awariami zgodności z defineProperty()wcześniejszymi __defineGetter__interfejsami API. Jeśli żaden interfejs API właściwości nie działa, należy powrócić do funkcji opakowania, która za każdym razem otrzymuje nowy znacznik czasu. (W takim przypadku tracisz informacje o numerze linii, ale znaczniki czasu będą nadal wyświetlane).


Boilerplate: Formatowanie czasu tak, jak lubię:

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); }
Beni Cherniavsky-Paskin
źródło
2

Dodaje to funkcję „logowania” do zakresu lokalnego (przy użyciu this) przy użyciu dowolnej liczby argumentów:

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

Możesz więc z niego korzystać:

this.log({test: 'log'}, 'monkey', 42);

Wyprowadza coś takiego:

[Pon, 11 marca 2013 16:47:49 GMT] Obiekt {test: "log"} małpa 42

Naftali alias Neal
źródło
2

rozszerzyło bardzo przyjemne rozwiązanie „z ciągiem formatu” z JSmyth o obsługę

  • Wszystkie inne console.logzmiany ( log, debug, info, warn, error)
  • w tym parametr elastyczności ciągu znacznika czasu (np. 09:05:11.518vs. 2018-06-13T09:05:11.518Z)
  • w tym awaryjne w przypadku, gdy consolejego funkcje nie istnieją w przeglądarkach

.

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'
Andreas Dietrich
źródło
Wadą jest jednak, że (na przykład w FF 56,0) to nie pokazuje lokalizację źródłową oświadczenie dziennika, ale jeden od Utl.jspowyżej . więc włączenie (komentowanie na żądanie / Utl.consoleWithTimestamps(...)wejście / wyłączenie) może mieć sens
Andreas Dietrich
1

Mam to w większości aplikacji Node.JS. Działa również w przeglądarce.

function log() {
  const now = new Date();
  const currentDate = `[${now.toISOString()}]: `;
  const args = Array.from(arguments);
  args.unshift(currentDate);
  console.log.apply(console, args);
}
Sójka
źródło
1

Rozwiązanie ES6:

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

gdzie timestamp()zwraca faktycznie sformatowany znacznik czasu i logdodaje znacznik czasu i propaguje wszystkie własne argumentyconsole.log

A. Rokinsky
źródło
1
Proszę opracować, wyjaśniając wszystkim, jaka funkcja zrobi to, co
Yatin Khullar,
Dzięki @YatinKhullar. Zmieniłem odpowiedź.
A. Rokinsky
0

Udoskonalenie odpowiedzi JSmyth:

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

To:

  • pokazuje znaczniki czasu z milisekundami
  • przyjmuje ciąg formatu jako pierwszy parametr do .log
blueFast
źródło
Wygląda to prawie wszystko dobrze, z tym wyjątkiem, że jeśli ty console.log(document, window), tzn. Bez założenia ciągu formatującego, dostaniesz coś jak 2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}zamiast documentbyć reprezentowanym jako rozszerzalne drzewo obiektów.
JSmyth
Zobacz tutaj, gdzie próbowałem znaleźć rozwiązanie problemu, który poruszyłeś (również przedwcześnie zaktualizowałem moją odpowiedź).
JSmyth
@JSmyth: jasne, dlatego jednym z wymagań mojego udoskonalenia jest to, że pierwszym argumentem jest ciąg formatu. Aby był elastyczny, prawdopodobnie wystarczyłoby sprawdzenie pierwszego argumentu jako łańcucha.
blueFast