timestamps console.log no Chrome?

235

Existe alguma maneira rápida de fazer com que o Chrome produza registros de data e hora em console.loggravações (como o Firefox). Ou está anexando new Date().getTime()a única opção?

Até o riacho
fonte
1
você pode alterar a resposta aceita? O segundo mais votado é muito mais simples.
Liron Yahdav
Parece que o Chrome mudou a forma de ativar isso. Veja, github.com/Microsoft/vscode/issues/61298#issuecomment-431422747
itsthetaste

Respostas:

425

No Chrome, existe a opção Configurações do console (Ferramentas do desenvolvedor -> Console -> Configurações [canto superior direito]) chamado "Mostrar carimbos de data / hora", exatamente o que eu precisava.

Acabei de encontrar. Não são necessários outros hacks sujos que destruam espaços reservados e apaguem o código no qual as mensagens foram registradas.

Atualização para o Chrome 68 ou superior

A configuração "Mostrar timestamps" foi movida para o painel Preferences das "DevTools settings", localizado no canto superior direito da gaveta do DevTools:

insira a descrição da imagem aqui

Krzysztof Wolny
fonte
3
Como apontou @Krzysztof Wolny, isso agora está incorporado ao Chrome 35 DevTools. (Yay!) Ative abrindo as ferramentas do desenvolvedor (por exemplo, F12 ou "Inspecionar elemento"), clique no "equipamento" para visualizar as configurações e marque a caixa de seleção "Mostrar timestamps" na seção "Console". ! Habilite a configuração de carimbos de data e hora no devtools twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/… codereview.chromium.org/185713007
iX3
1
Existe uma maneira de usar um padrão para o carimbo de data / hora no Chrome? Eu só preciso de hora e minuto.
Guus
31
No Chrome 68.0.3440.106, eu tive que abrir as ferramentas de desenvolvimento (F12)> clique no menu de três pontos no canto superior direito> clique em configurações> selecione Preferências no menu esquerdo> verifique os carimbos de hora na seção Console da tela de configurações (canto superior direito) )
tekiegirl 4/18
5
70.0.3538.110 (Compilação oficial) (64 bits) Esta resposta já funcionou para mim: ie "ícone de engrenagem" do console; Marca de seleção "Mostrar data e hora" ... mas agora não vejo "Mostrar data e hora" no Chrome 70.0.3538.110 (Compilação oficial) (64 bits) Então tentei a sugestão do @ tekiegirl: Chrome 68: ou seja, ferramentas de desenvolvimento abertas (F12 )> clique no menu de três pontos no canto superior direito> clique em configurações> selecione Preferences no menu à esquerda> verificação mostram marcas de tempo ... mas eu não ver "Preferências" no menu à esquerda de configurações 70.0.3538.110 (Versão oficial ) (64 bits)
The Red Pea
2
Obrigado @tekiegirl, concordo, sua resposta resolve meu problema! Ou seja, os usuários do Chrome 68+ devem alterar as configurações do DevTools (em comparação com a gaveta para configurações rápidas do console ). Nas configurações do DevTools, guia "Preferências", cabeçalho "Console"; você encontrará a caixa de seleção "Mostrar timestamps".
The Red Pea
81

Tente o seguinte:

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

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



Ou isso, caso você queira um carimbo de data / hora:

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

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



Para registrar mais de uma coisa e de uma maneira agradável (como a representação em árvore de objetos):

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

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



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


Saídas com isso:

Saída de amostra

PS: testado apenas no Chrome.

PPS: Array.prototype.slicenão é perfeito aqui, pois seria registrado como uma matriz de objetos e não como uma série.

JSmyth
fonte
Reescreveu a instrução de log para exibir objetos no console do Chrome de uma maneira adorável, a versão anterior estava simplesmente mostrando "[objeto Objeto]" ou algo parecido.
precisa saber é o seguinte
@Neal, é claro que não - você tem que estendê-lo (; Você pode fazer algo parecido com isso
JSmyth
Isso não vai funcionar no caso geral em que o primeiro argumento para log é uma seqüência de formato
blueFast
@gonvaled excluiu meu comentário, pois realmente não fazia sentido - falta de café no sangue. Você está correto, este código de exemplo não assume especificadores de formato. Eu acho que podemos entrar em um limbo aqui e verificar os especificadores de string de formato, com base em que produzem saídas diferentes.
JSmyth
Alguma maneira de lidar bem com as novas linhas ? Uma mensagem de várias linhas é exibida em várias linhas pelo chrome, mas quando em uma sequência, ela se torna uma longa linha com o caractere in.
Dan Dascalescu
20

Você pode usar o criador de ferramentas de ferramentas de desenvolvimento.

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

"Nome do temporizador" deve ser o mesmo. Você pode usar várias instâncias do timer com nomes diferentes.

SerzN1
fonte
Também existe console.timeStamp('foo')um ponto amarelo na linha do tempo. Não funcionou para mim ao usar nomes com espaços tho.
Vimim.us
isso não responde à pergunta relacionada console.logou ao log de todos
Andreas Dietrich
@AndreasDietrich porque não? Faz saída para o console. Mais sobre isso neste post de blog de
JP Hellemons
18

Eu o adicionei originalmente como comentário, mas queria adicionar uma captura de tela porque pelo menos uma pessoa não conseguiu encontrar a opção (ou talvez ela não estivesse disponível em sua versão específica por algum motivo).

No Chrome 68.0.3440.106 (e agora registrada em 72.0.3626.121), tive que

  • ferramentas de desenvolvimento abertas (F12)
  • clique no menu de três pontos no canto superior direito
  • clique em configurações
  • selecione Preferências no menu esquerdo
  • verifique mostrar os carimbos de hora na seção Console da tela de configurações

Configurações> Preferências> Console> Mostrar timestamps

tekiegirl
fonte
7

Eu converto argumentspara Matriz usando Array.prototype.slicepara que eu possa concatcom outra Matriz do que eu quero adicionar e depois a transmito 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 também argumentspode ser Array.prototype.unshifteditado, mas não sei se modificá-lo dessa maneira é uma boa ideia / terá outros efeitos colaterais

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

+new Datee Date.now()são formas alternativas de obter registros de data e hora

KiL
fonte
Obrigado, +1, mas eu esperava que houvesse algum suporte para isso sem precisar adicionar código.
UpTheCreek 17/08/2012
6

Se você estiver usando o navegador Google Chrome, poderá usar a API do console do Chrome:

  • console.time: chame-o no ponto do código em que deseja iniciar o timer
  • console.timeEnd: ligue para parar o cronômetro

O tempo decorrido entre essas duas chamadas é exibido no console.

Para informações detalhadas, consulte o link do documento: https://developers.google.com/chrome-developer-tools/docs/console

Ian Jiang
fonte
Expandir isso um pouco para aqueles como eu com preguiça de ir e procurar. O uso correto é: console.time ("myMeasure"); [código que você deseja cronometrar] console.timeEnd ("myMeasure");
Samih
isso não responde à pergunta relacionada ao console.log ou ao log de todos
Andreas Dietrich
6

No Chrome 68:

"Mostrar timestamps" movido para configurações

A caixa de seleção Mostrar carimbos de data e hora anteriormente em Configurações do console Configurações do console mudou para Configurações .

insira a descrição da imagem aqui

itsazzad
fonte
2
A resposta de @ tekiegirl tem uma captura de tela mostrando onde encontrar a caixa de seleção nas configurações do DevTools; a captura de tela nesta resposta não mostra onde encontrar a caixa de seleção "Mostrar timestamps".
The Red Pea
4

Tente também:

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

Esta função coloca o carimbo de data / hora, o nome do arquivo e o número da linha iguais aos incorporados console.log.

sho terunuma
fonte
Function A logfunção criada dessa maneira congela um carimbo de data / hora fixo; você teria que reexecutar isso toda vez que quiser uma hora atualizada [= data atualizada; -]. É possível tornar isso uma função, mas você teria que usá-lo como em mklog()(...)vez de log().
Beni Cherniavsky-Paskin
3

Se você deseja preservar as informações do número da linha (cada mensagem apontando para sua chamada .log (), nem todas apontando para o nosso invólucro), é necessário usar .bind(). Você pode anexar um argumento extra de registro de data e hora, console.log.bind(console, <timestamp>)mas o problema é que você deve executá-lo novamente toda vez para vincular uma função a um registro de data e hora novo. Uma maneira estranha de fazer isso é uma função que retorna uma função vinculada:

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 deve ser usado com uma chamada dupla:

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

MAS podemos tornar implícita a primeira chamada instalando uma propriedade com a função getter:

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

Agora você acabou de ligar console.log(...)e automagicamente ele precede um carimbo de data e hora!

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

Você pode até conseguir esse comportamento mágico com um simples, em log()vez de console.log()fazer Object.defineProperty(window, "log", ...).


Consulte https://github.com/pimterry/loglevel para obter um wrapper de console seguro bem-sucedido usando .bind(), com fallbacks de compatibilidade.

Consulte https://github.com/eligrey/Xccessors para obter fallbacks de compatibilidade da API defineProperty()herdada __defineGetter__. Se nenhuma API de propriedade funcionar, você deverá fazer o fallback para uma função de wrapper que receba um carimbo de data / hora novo sempre. (Nesse caso, você perde as informações do número da linha, mas os carimbos de data e hora ainda são exibidos.)


Boilerplate: Hora de formatar da maneira que eu gosto:

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

Isso adiciona uma função "log" ao escopo local (usando this) usando quantos argumentos você desejar:

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

Então você pode usá-lo:

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

Produz algo como isto:

[Seg, 11 de março de 2013 16:47:49 GMT] Objeto {test: "log"} macaco 42

Naftali tcp Neal
fonte
2

estendeu a solução muito agradável "com string de formato" do JSmyth para também suportar

  • todas as outras console.logvariações ( log, debug, info, warn, error)
  • incluindo o parâmetro de flexibilidade da cadeia de data e hora (por exemplo, 09:05:11.518vs.2018-06-13T09:05:11.518Z )
  • incluindo fallback no caso consoleou suas funções não existem nos 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'
Andreas Dietrich
fonte
uma desvantagem é que (por exemplo, no FF 56.0), ele não mostra o local de origem da instrução de log, mas o local Utl.jsacima . permitindo assim (sob demanda comentando in / out) do Utl.consoleWithTimestamps(...)-override pode fazer sentido
Andreas Dietrich
1

Eu tenho isso na maioria dos aplicativos Node.JS. Também funciona no navegador.

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

Solução ES6:

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

onde timestamp()retorna o carimbo de data / hora realmente formatado e logadiciona um carimbo de hora e propaga todos os seus próprios argumentos paraconsole.log

A. Rokinsky
fonte
1
Por favor, elabore deixando claro para todos entenderem que função fará o que
Yatin Khullar
Obrigado @YatinKhullar. Eu mudei minha resposta.
A. Rokinsky
0

Um refinamento na resposta 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);
    }
};

Este:

  • mostra registros de data e hora com milissegundos
  • assume uma string de formato como primeiro parâmetro para .log
blueFast
fonte
Isso parece quase tudo de bom, exceto que se você console.log(document, window), ou seja, sem a suposição de string de formato, você obteria smth. como em 2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}vez de documentser representado como uma árvore de objetos expansível.
JSmyth
Veja aqui onde tentei encontrar uma solução para o problema que você levantou (também atualizei minha resposta prematuramente).
JSmyth
@JSmyth: claro, é por isso que um dos requisitos do meu refinamento é que o primeiro argumento seja uma string de formato. Para torná-lo flexível, provavelmente uma verificação do primeiro argumento como uma sequência seria suficiente.
blueFast