¿Las marcas de tiempo de console.log en Chrome?


235

¿Hay alguna forma rápida de hacer que Chrome muestre marcas de tiempo en console.logescrituras (como lo hace Firefox)? ¿O es anteponer new Date().getTime()la única opción?


1
¿puedes cambiar la respuesta aceptada? El segundo más votado es mucho más simple.
Liron Yahdav

Parece que Chrome ha cambiado la forma de activar esto. Ver, github.com/Microsoft/vscode/issues/61298#issuecomment-431422747
itsthetaste

Respuestas:


425

En Chrome, existe la opción Configuración de la consola (Herramientas para desarrolladores -> Consola -> Configuración [esquina superior derecha]) llamada "Mostrar marcas de tiempo", que es exactamente lo que necesitaba.

Lo acabo de encontrar. No se necesitan otros trucos sucios que destruyan los marcadores de posición y borren el lugar en el código desde donde se registraron los mensajes.

Actualización para Chrome 68+

La configuración "Mostrar marcas de tiempo" se ha movido al panel de Preferencias de la "Configuración de DevTools", que se encuentra en la esquina superior derecha del cajón DevTools:

ingrese la descripción de la imagen aquí


3
Como señaló @Krzysztof Wolny, esto ahora está integrado en Chrome 35 DevTools. (¡Sí!) Habilite abriendo las herramientas de desarrollador (por ejemplo, F12 o "Inspeccionar elemento"), haga clic en el "engranaje" para ver la configuración, luego marque la casilla de verificación "Mostrar marcas de tiempo" en la sección "Consola". ! Habilite la configuración de marcas de tiempo en devtools twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/… codereview.chromium.org/185713007
iX3

1
¿Hay alguna manera de usar un patrón para la marca de tiempo en Chrome? Solo necesito la hora y los minutos.
Guus

31
En Chrome 68.0.3440.106 tuve que abrir las herramientas de desarrollo (F12)> hacer clic en el menú de tres puntos en la parte superior derecha> hacer clic en configuración> seleccionar Preferencias en el menú de la izquierda> verificar mostrar marcas de tiempo en la sección Consola de la pantalla de configuración (arriba a la derecha )
tekiegirl

55
70.0.3538.110 (Versión oficial) (64 bits) Esta respuesta me funcionó una vez: es decir, el "icono de engranaje" de la consola; Marca de verificación "Mostrar marcas de tiempo" ... pero ahora no veo "Mostrar marcas de tiempo" en Chrome 70.0.3538.110 (versión oficial) (64 bits) Así que probé la sugerencia de @ tekiegirl con respecto a Chrome 68: es decir, herramientas de desarrollo abiertas (F12 )> haga clic en el menú de tres puntos en la parte superior derecha> haga clic en configuración> seleccione Preferencias en el menú de la izquierda> verificación Mostrar marcas de tiempo ... pero yo no lo veo "Preferencias" en el menú de la izquierda de la configuración 70.0.3538.110 (Build Oficial ) (64 bits)
The Red Pea

2
Gracias @tekiegirl, de acuerdo, ¡tu respuesta resuelve mi problema! Es decir, los usuarios de Chrome 68+ deben cambiar la configuración de DevTools (frente al cajón para la configuración rápida de la consola ) .en la configuración de DevTools, pestaña "Preferencias", encabezado "Consola"; encontrará la casilla de verificación "Mostrar marcas de tiempo".
The Red Pea

81

Prueba esto:

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

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



O esto, en caso de que desee una marca de tiempo:

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

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



Para registrar más de una cosa y de una manera agradable (como la representación del árbol de objetos):

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

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



Con cadena de formato ( 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);
        }
    }
};


Salidas con eso:

Salida de muestra

PD: Probado solo en Chrome.

PPS: Array.prototype.sliceno es perfecto aquí porque se registraría como una matriz de objetos en lugar de una serie de los de.


Reescribió la declaración de registro para mostrar objetos en la consola de Chrome de una manera encantadora, la versión anterior simplemente mostraba "[objeto Objeto]" o algo así.
JSmyth

@Neal, por supuesto que no, tienes que extenderlo (; Puedes hacer algo como esto
JSmyth

Esto no funcionará en el caso general donde el primer argumento para iniciar sesión es una cadena de formato
blueFast

@gonvaled eliminó mi comentario ya que realmente no tenía sentido: falta de café en la sangre. Tienes razón, este código de ejemplo no asume especificadores de formato. Creo que podemos salir de apuros aquí y verificar los especificadores de cadena de formato, basados ​​en que producen diferentes salidas.
JSmyth

¿Alguna forma de manejar bien las nuevas líneas ? Un mensaje de varias líneas se muestra en varias líneas mediante cromo, pero cuando se encuentra en una cadena, se convierte en una línea larga con el carácter ↵.
Dan Dascalescu

20

Puedes usar herramientas de desarrollo de perfil.

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

El "nombre del temporizador" debe ser el mismo. Puede usar varias instancias de temporizador con diferentes nombres.


También console.timeStamp('foo')aparece como un punto amarillo en la línea de tiempo. No funcionó para mí cuando uso nombres con espacios aunque.
Vitim.us

esto no responde a la pregunta relacionada con console.logel registro en absoluto
Andreas Dietrich

@AndreasDietrich ¿por qué no? Hace salida a la consola. Más sobre esto en este blog de
JP Hellemons

18

Originalmente agregué esto como un comentario, pero quería agregar una captura de pantalla ya que al menos una persona no pudo encontrar la opción (o tal vez no estaba disponible en su versión particular por alguna razón).

En Chrome 68.0.3440.106 (y ahora registrado en 72.0.3626.121) tuve que

  • abrir herramientas de desarrollo (F12)
  • haz clic en el menú de tres puntos en la esquina superior derecha
  • haga clic en configuración
  • seleccione Preferencias en el menú de la izquierda
  • marque mostrar marcas de tiempo en la sección Consola de la pantalla de configuración

Configuración> Preferencias> Consola> Mostrar marcas de tiempo


7

Me convierto argumentsa Array usando Array.prototype.slicepara poder concatcon otro Array de lo que quiero agregar, luego lo paso 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"]

Parece que también argumentsse puede Array.prototype.unshifteditar, pero no sé si modificarlo así es una buena idea / tendrá otros efectos secundarios

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 Datey Date.now()son formas alternativas de obtener marcas de tiempo


Gracias, +1, pero esperaba que pudiera haber algún soporte para esto sin tener que agregar código.
UpTheCreek

6

Si está utilizando el navegador Google Chrome, puede usar la API de la consola de Chrome:

  • console.time: llámelo al punto en su código donde desea iniciar el temporizador
  • console.timeEnd: llámalo para detener el temporizador

El tiempo transcurrido entre estas dos llamadas se muestra en la consola.

Para obtener información detallada, consulte el enlace del documento: https://developers.google.com/chrome-developer-tools/docs/console


Para ampliar esto un poco para aquellos como yo, demasiado flojos para ir y buscarlo. El uso correcto es: console.time ("myMeasure"); [código que desea cronometrar] console.timeEnd ("myMeasure");
Samih

esto no responde a la pregunta relacionada con console.log o el registro en absoluto
Andreas Dietrich

6

Desde Chrome 68:

"Mostrar marcas de tiempo" movido a la configuración

La casilla de verificación Mostrar marcas de tiempo previamente en Configuración de la consola Configuración de la consola se ha movido a Configuración .

ingrese la descripción de la imagen aquí


2
La respuesta de @tekiegirl tiene una captura de pantalla que muestra dónde encontrar la casilla de verificación en la Configuración de DevTools; la captura de pantalla en esta respuesta no me muestra dónde encontrar la casilla de verificación "Mostrar marcas de tiempo".
The Red Pea

4

Prueba esto también:

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

Esta función coloca la marca de tiempo, el nombre de archivo y el número de línea como los mismos que los incorporados console.log.


ׁ La logfunción creada de esta manera congela una marca de tiempo fija; tendrías que volver a ejecutar esto cada vez que quieras una hora actualizada [= fecha actual; -]. Es posible hacer que esta sea una función, pero tendrías que usarla como en mklog()(...)lugar de log().
Beni Cherniavsky-Paskin

3

Si desea preservar la información del número de línea (cada mensaje apunta a su llamada .log (), no todos apuntan a nuestro contenedor), debe usar .bind(). Puede anteponer un argumento de marca de tiempo adicional a través de, console.log.bind(console, <timestamp>)pero el problema es que necesita volver a ejecutar esto cada vez para obtener una función vinculada con una nueva marca de tiempo. Una forma incómoda de hacerlo es una función que devuelve una función enlazada:

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

que luego debe usarse con una doble llamada:

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

PERO podemos hacer la primera llamada implícita instalando una propiedad con la función getter:

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

¡Ahora solo llama console.log(...)y automágicamente antepone una marca de tiempo!

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

Incluso puede lograr este comportamiento mágico con un simple en log()lugar de console.log()hacerlo Object.defineProperty(window, "log", ...).


Consulte https://github.com/pimterry/loglevel para obtener una envoltura de consola segura bien hecha, con fallos de .bind()compatibilidad.

Consulte https://github.com/eligrey/Xccessors para ver los retrocesos de compatibilidad de la API defineProperty()heredada __defineGetter__. Si ninguna de las API de propiedades funciona, debería recurrir a una función de contenedor que obtenga una nueva marca de tiempo cada vez. (En este caso, pierde la información del número de línea, pero aún se mostrarán las marcas de tiempo).


Boilerplate: Formateo de tiempo como a mí me gusta:

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

Esto agrega una función "log" al ámbito local (usando this) usando tantos argumentos como desee:

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

Para que pueda usarlo:

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

Produce algo como esto:

[Lunes, 11 de marzo de 2013 16:47:49 GMT] Objeto {prueba: "log"} mono 42


2

extendió la muy buena solución "con formato de cadena" de JSmyth para admitir también

  • todas las otras console.logvariaciones ( log, debug, info, warn, error)
  • incluyendo el parámetro de flexibilidad de cadena de marca de tiempo (p. ej 09:05:11.518.2018-06-13T09:05:11.518Z )
  • incluido el respaldo en caso de que consolesus funciones no existan en los navegadores

.

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'

Sin embargo, una desventaja es que (por ejemplo, en FF 56.0) no muestra la ubicación de origen de la declaración de registro, sino la de la Utl.jsanterior . entonces habilitar (comentar bajo demanda dentro / fuera) de la Utl.consoleWithTimestamps(...)anulación puede tener sentido
Andreas Dietrich

1

Tengo esto en la mayoría de las aplicaciones Node.JS. También funciona en el navegador.

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

1

Solución ES6:

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

donde timestamp()devuelve loguna marca de tiempo formateada y agrega una marca de tiempo y propaga todos los argumentos propios aconsole.log


1
Por favor, explique dejando claro para todos, qué función hará qué
Yatin Khullar

Gracias @YatinKhullar. He cambiado mi respuesta.
A. Rokinsky

0

Un refinamiento en la respuesta de 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);
    }
};

Esta:

  • muestra marcas de tiempo con milisegundos
  • asume una cadena de formato como primer parámetro para .log

Esto se ve casi todo bien, excepto que si usted console.log(document, window), es decir, sin el supuesto de formato de cadena, obtendría algo. 2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}Me gusta en lugar de documentser representado como un árbol de objetos expandible.
JSmyth

Vea aquí donde traté de encontrar una solución al problema que mencionó (también actualicé mi respuesta aunque prematuramente).
JSmyth

@JSmyth: claro, es por eso que uno de los requisitos de mi refinamiento es que el primer argumento es una cadena de formato. Para hacerlo flexible, probablemente una comprobación del primer argumento para ser una cadena sería suficiente.
blueFast
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.