Konsolen.log-Zeitstempel in Chrome?

234

Gibt es eine schnelle Möglichkeit, Chrome dazu zu bringen, Zeitstempel in console.logSchreibvorgängen auszugeben (wie es Firefox tut) ? Oder ist das Voranstellen new Date().getTime()die einzige Option?

UpTheCreek
quelle
1
Können Sie bitte die akzeptierte Antwort ändern? Der am zweithäufigsten gewählte ist viel einfacher.
Liron Yahdav
Anscheinend hat Chrome die Aktivierung geändert. Siehe github.com/Microsoft/vscode/issues/61298#issuecomment-431422747
itsthetaste

Antworten:

424

In Chrome gibt es die Option "Konsoleneinstellungen" (Entwicklertools -> Konsole -> Einstellungen [obere rechte Ecke]) mit dem Namen "Zeitstempel anzeigen", die genau das ist, was ich brauchte.

Ich habe es gerade gefunden. Es sind keine weiteren schmutzigen Hacks erforderlich, die Platzhalter zerstören und die Stelle im Code löschen, von dem aus die Nachrichten protokolliert wurden.

Update für Chrome 68+

Die Einstellung "Zeitstempel anzeigen" wurde in den Bereich "Einstellungen" der "DevTools-Einstellungen" in der oberen rechten Ecke der DevTools-Schublade verschoben:

Geben Sie hier die Bildbeschreibung ein

Krzysztof Wolny
quelle
3
Wie @Krzysztof Wolny betonte, ist dies jetzt in Chrome 35 DevTools integriert. (Yay!) Aktivieren Sie diese Option, indem Sie Entwicklertools (z. B. F12 oder "Inspect Element") öffnen, auf das "Zahnrad" klicken, um die Einstellungen anzuzeigen, und aktivieren Sie dann das Kontrollkästchen "Zeitstempel anzeigen" im Abschnitt "Konsole". ! Aktivieren Sie die Zeitstempel - Einstellung in devtools twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/... codereview.chromium.org/185713007
Ix3
1
Gibt es eine Möglichkeit, ein Muster für den Zeitstempel in Chrome zu verwenden? Ich brauche nur die Stunde und Minute.
Guus
30
Unter Chrome 68.0.3440.106 musste ich die Entwicklungstools (F12) öffnen> oben rechts auf das Dreipunktmenü klicken> auf Einstellungen klicken> im linken Menü Einstellungen auswählen> Zeitstempel im Bereich Konsole des Einstellungsbildschirms (oben rechts) aktivieren )
Tekiegirl
5
70.0.3538.110 (Official Build) (64-Bit) Diese Antwort hat einmal für mich funktioniert: dh Konsole "Zahnradsymbol"; "Show - Zeitstempel" Häkchen ... aber jetzt ich nicht sehen "Show - Zeitstempel" in Chrome 70.0.3538.110 (Official Körperbau) (64-bit) Also ich @ tekiegirl Vorschlag erneut versucht: Chrome 68: zB offene Entwickler - Tool (F12 die drei-Punkt - Menü oben rechts)> klicken Sie auf > Einstellungen klicken> wählen Einstellungen im linken Menü> Check zeigen Zeitstempel ... aber ich nicht „Einstellungen“ finden Sie im linken Menü von Einstellungen 70.0.3538.110 (Official Körperbau ) (64-Bit)
Die rote Erbse
2
Danke @tekiegirl, stimme zu, deine Antwort löst mein Problem! Das heißt, Benutzer von Chrome 68+ müssen die DevTools-Einstellungen ändern (im Vergleich zur Schublade für schnelle Konsoleneinstellungen ). In den DevTools-Einstellungen, Registerkarte "Einstellungen", "Konsole" -Header; Sie finden das Kontrollkästchen "Zeitstempel anzeigen".
Die rote Erbse
81

Versuche dies:

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

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



Oder dies, falls Sie einen Zeitstempel wünschen:

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

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



Um sich einzuloggen mehr als eine Sache und in einer netten Art und Weise (wie Objektbaumdarstellung):

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

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



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


Ausgaben damit:

Beispielausgabe

PS: Nur in Chrome getestet.

PPS: Array.prototype.sliceist hier nicht perfekt, da es als Array von Objekten und nicht als Serie von Objekten protokolliert wird.

JSmyth
quelle
Die Protokollanweisung wurde neu geschrieben, um Objekte in der Chrome-Konsole auf schöne Weise anzuzeigen. In der vorherigen Version wurde lediglich "[Objekt Objekt]" oder eine Art angezeigt.
JSmyth
@Neal, natürlich ist es nicht - Sie haben es zu verlängern (; Sie so etwas wie tun kann dies
JSmyth
Dies funktioniert nicht im allgemeinen Fall, in dem das erste zu protokollierende Argument eine
Formatzeichenfolge
@gonvaled hat meinen Kommentar gelöscht, da er wirklich keinen Sinn ergab - Mangel an Kaffee im Blut. Sie haben Recht, dieser Beispielcode setzt keine Formatspezifizierer voraus. Ich denke, wir können hier auf die Nerven gehen und nach den Format-String-Spezifizierern suchen, die darauf basieren und unterschiedliche Ausgaben erzeugen.
JSmyth
Wie kann man gut mit Zeilenumbrüchen umgehen ? Eine mehrzeilige Nachricht wird in mehreren Zeilen in Chrom angezeigt. In einer Zeichenfolge wird sie jedoch zu einer langen Zeile mit dem Zeichen ↵.
Dan Dascalescu
20

Sie können den Dev Tools Profiler verwenden.

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

"Timername" muss identisch sein. Sie können mehrere Instanzen von Timern mit unterschiedlichen Namen verwenden.

SerzN1
quelle
Es gibt auch console.timeStamp('foo')nur einen gelben Punkt in der Zeitleiste. Es hat bei mir nicht funktioniert, wenn ich Namen mit Leerzeichen verwendet habe.
Vitim.us
Dies beantwortet nicht die Frage im Zusammenhang mit console.logoder die Protokollierung überhaupt
Andreas Dietrich
@AndreasDietrich warum nicht? Es wird an die Konsole ausgegeben. Mehr dazu in diesem Blogpost 2013 blog.mariusschulz.com/2013/11/22/…
JP Hellemons
18

Ich habe dies ursprünglich als Kommentar hinzugefügt, wollte aber einen Screenshot hinzufügen, da mindestens eine Person die Option nicht finden konnte (oder sie aus irgendeinem Grund in ihrer jeweiligen Version nicht verfügbar war).

Auf Chrome 68.0.3440.106 (und jetzt in 72.0.3626.121 eingecheckt) musste ich

  • offene Entwicklungswerkzeuge (F12)
  • Klicken Sie oben rechts auf das Dreipunktmenü
  • Klicken Sie auf Einstellungen
  • Wählen Sie im linken Menü Einstellungen
  • Aktivieren Sie im Abschnitt "Konsole" des Einstellungsbildschirms die Option "Zeitstempel anzeigen"

Einstellungen> Einstellungen> Konsole> Zeitstempel anzeigen

Tekiegirl
quelle
7

Ich konvertiere argumentsin Array mit, Array.prototype.slicedamit ich concatmit einem anderen Array von dem, was ich hinzufügen möchte, es dann übergeben kann 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"]

Es scheint, dass argumentsdies auch Array.prototype.unshiftbearbeitet werden kann, aber ich weiß nicht, ob eine solche Änderung eine gute Idee ist / andere Nebenwirkungen haben wird

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.
quelle
6

+new Dateund Date.now()sind alternative Möglichkeiten, um Zeitstempel zu erhalten

KiL
quelle
Danke, +1, aber ich hatte gehofft, dass dies unterstützt wird, ohne dass Code hinzugefügt werden muss.
UpTheCreek
6

Wenn Sie den Google Chrome-Browser verwenden, können Sie die Chrome Console-API verwenden:

  • console.time: Rufen Sie es an der Stelle in Ihrem Code auf, an der Sie den Timer starten möchten
  • console.timeEnd: Rufen Sie es auf, um den Timer zu stoppen

Die zwischen diesen beiden Anrufen verstrichene Zeit wird in der Konsole angezeigt.

Weitere Informationen finden Sie unter dem Link zum Dokument: https://developers.google.com/chrome-developer-tools/docs/console

Ian Jiang
quelle
Um dies ein wenig zu erweitern, für diejenigen wie mich, die zu faul sind, um es nachzuschlagen. Die korrekte Verwendung lautet: console.time ("myMeasure"); [Code, den Sie zeitlich festlegen möchten] console.timeEnd ("myMeasure");
Samih
Dies beantwortet nicht die Frage im Zusammenhang mit console.log oder der Protokollierung überhaupt
Andreas Dietrich
6

Aus Chrome 68:

"Zeitstempel anzeigen" wurde in die Einstellungen verschoben

Die anzeigen Zeitstempel Checkbox zuvor in Konsoleneinstellungen Konsoleneinstellungen werden verschoben Einstellungen .

Geben Sie hier die Bildbeschreibung ein

itsazzad
quelle
2
Die Antwort von @ tekiegirl enthält einen Screenshot, der zeigt, wo sich das Kontrollkästchen in den DevTools-Einstellungen befindet. Der Screenshot in dieser Antwort zeigt mir nicht, wo sich das Kontrollkästchen "Zeitstempel anzeigen" befindet.
Die rote Erbse
4

Versuchen Sie dies auch:

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

Mit dieser Funktion werden Zeitstempel, Dateiname und Zeilennummer mit dem integrierten Wert identisch console.log.

sho terunuma
quelle
ׁ Die auf logdiese Weise erstellte Funktion friert einen festen Zeitstempel ein. Sie müssten dies jedes Mal wiederholen, wenn Sie eine aktuelle Uhrzeit wünschen [= aktuelles Datum; -]. Es ist möglich, dies zu einer Funktion zu machen, aber Sie müssten es wie mklog()(...)statt verwenden log().
Beni Cherniavsky-Paskin
3

Wenn Sie die Zeilennummerninformationen beibehalten möchten (jede Nachricht, die auf ihren .log () -Aufruf verweist, nicht alle auf unseren Wrapper), müssen Sie verwenden .bind(). Sie können ein zusätzliches Zeitstempel-Argument über voranstellen. console.log.bind(console, <timestamp>)Das Problem besteht jedoch darin, dass Sie dieses Argument jedes Mal erneut ausführen müssen, um eine Funktion mit einem neuen Zeitstempel zu verknüpfen. Ein umständlicher Weg, dies zu tun, ist eine Funktion, die eine gebundene Funktion zurückgibt:

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

was dann mit einem doppelten Aufruf verwendet werden muss:

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

ABER wir können den ersten Aufruf implizit machen, indem wir eine Eigenschaft mit der Getter-Funktion installieren :

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

Jetzt rufen Sie einfach an console.log(...)und es wird automatisch ein Zeitstempel vorangestellt!

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

Sie können dieses magische Verhalten sogar mit einem einfachen log()statt console.log()durch Tun erreichen Object.defineProperty(window, "log", ...).


Unter https://github.com/pimterry/loglevel finden Sie einen gut gemachten sicheren Konsolen-Wrapper .bind()mit Kompatibilitäts-Fallbacks.

Unter https://github.com/eligrey/Xccessors finden Sie Kompatibilitätsrückschläge von defineProperty()der Legacy- __defineGetter__API. Wenn keine der Eigenschaften-APIs funktioniert, sollten Sie auf eine Wrapper-Funktion zurückgreifen, die jedes Mal einen neuen Zeitstempel erhält. (In diesem Fall verlieren Sie die Zeilennummerninformationen, aber die Zeitstempel werden weiterhin angezeigt.)


Boilerplate: Zeitformatierung nach meinen Wünschen:

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
quelle
2

Dadurch wird dem lokalen Bereich eine "Protokoll" -Funktion hinzugefügt (unter Verwendung this), wobei so viele Argumente verwendet werden, wie Sie möchten:

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

So können Sie es verwenden:

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

Gibt ungefähr so ​​aus:

[Mon, 11 Mar 2013 16:47:49 GMT] Objekt {test: "log"} Affe 42

Naftali alias Neal
quelle
2

erweiterte die sehr schöne Lösung "mit Formatzeichenfolge " von JSmyth auf Unterstützung

  • alle anderen console.logVariationen ( log, debug, info, warn, error)
  • einschließlich Zeitstempel-String-Flexibilitätsparameter (z. B. 09:05:11.518vs. 2018-06-13T09:05:11.518Z)
  • einschließlich Fallback für den Fall consoleoder seine Funktionen sind in Browsern nicht vorhanden

.

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
quelle
Ein Nachteil ist jedoch, dass (z. B. in FF 56.0) nicht der Quellspeicherort der Protokollanweisung angezeigt wird, sondern der von Utl.jsoben . Utl.consoleWithTimestamps(...)Daher kann es sinnvoll sein, den Override zu aktivieren (bei Bedarf zu kommentieren)
Andreas Dietrich,
1

Ich habe dies in den meisten Node.JS-Apps. Es funktioniert auch im Browser.

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

ES6-Lösung:

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

Dabei werden timestamp()tatsächlich formatierte Zeitstempel zurückgegeben log, ein Zeitstempel hinzugefügt und alle eigenen Argumente an weitergegebenconsole.log

A. Rokinsky
quelle
1
Bitte erläutern Sie, indem Sie klar machen, welche Funktion was
bewirken
Danke @YatinKhullar. Ich habe meine Antwort geändert.
A. Rokinsky
0

Eine Verfeinerung der Antwort von 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);
    }
};

Dies:

  • zeigt Zeitstempel mit Millisekunden
  • nimmt eine Formatzeichenfolge als ersten Parameter an .log
blueFast
quelle
Das sieht fast alles gut aus, außer dass Sie console.log(document, window), wenn Sie , dh ohne die Annahme einer Formatzeichenfolge, etw bekommen würden. wie 2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}anstatt documentals erweiterbarer Objektbaum dargestellt zu werden.
JSmyth
Sehen Sie hier, wo ich versucht habe, eine Lösung für das von Ihnen angesprochene Problem zu finden (meine Antwort wurde jedoch vorzeitig aktualisiert).
JSmyth
@JSmyth: Sicher, deshalb ist eine der Anforderungen meiner Verfeinerung, dass das erste Argument eine Formatzeichenfolge ist. Um es flexibel zu machen, würde wahrscheinlich eine Überprüfung des ersten Arguments als Zeichenfolge ausreichen.
blueFast