Chromeのconsole.logタイムスタンプ?


235

Chromeにconsole.log書き込みでタイムスタンプを出力させる簡単な方法はありますか(Firefoxのように)。または、先頭new Date().getTime()に追加する唯一のオプションですか?


1
受け入れられた回答を変更していただけますか?2番目に多く投票された方がはるかに単純です。
Liron Yahdav、2015

Chromeを有効にする方法が変更されたようです。、参照github.com/Microsoft/vscode/issues/61298#issuecomment-431422747を
itsthetaste

回答:


425

Chromeでは、「タイムスタンプを表示」というオプションがコンソール設定(開発者ツール->コンソール->設定[右上隅])にあり、これがまさに私が必要とするものです。

見つけたところです。プレースホルダーを破壊し、メッセージが記録されたコード内の場所を消去する他のダーティーハックは必要ありません。

Chrome 68以降のアップデート

[タイムスタンプを表示]設定は、DevToolsドロワーの右上隅にある[DevTools設定]の[設定]ペインに移動しました。

ここに画像の説明を入力してください


3
@Krzysztof Wolnyが指摘したように、これはChrome 35 DevToolsに組み込まれています。(Yay!)開発者ツール(F12または「要素の検査」など)を開いて有効にし、「ギア」をクリックして設定を表示し、「コンソール」セクションの「タイムスタンプを表示」チェックボックスをオンにします。!デベロッパーツールのタイムスタンプの設定を有効に twitter.com/addyosmani#stream-item-tweet-485862365247053824 html5rocks.com/en/tutorials/developertools/chrome-35/... codereview.chromium.org/185713007
IX3

1
Chromeのタイムスタンプにパターンを使用する方法はありますか?時間と分だけが必要です。
Guus

31
Chrome 68.0.3440.106で開発ツール(F12)を開く必要がありました>右上の3つのドットのメニューをクリック>設定をクリック>左側のメニューで[設定]を選択>設定画面(右上)の[コンソール]セクションでタイムスタンプの表示を確認)
tekiegirl

5
70.0.3538.110(公式ビルド)(64ビット)この答えはかつて私に有効でした。つまり、コンソールの「ギアアイコン」。チェックマークを「ショータイムスタンプ」...しかし、今、私はしません「の表示がタイムスタンプ」を参照してくださいクローム70.0.3538.110(公式ビルド)(64ビット)でだから私はtekiegirlの提案の再@試してみました:クローム68:すなわちオープン開発ツール(F12 )>左側のメニュー>チェックショータイムスタンプに設定]を選択> [設定]をクリックします>トップの右に3ドットメニューをクリックしてください...しかし、私はしていない「環境設定」を参照設定70.0.3538.110の左側のメニューでの(公式ビルド)(64ビット)
Red Pea

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のコンソールにオブジェクトを素敵な方法で表示するようにログステートメントを書き直しました。以前のバージョンは単に「[オブジェクトオブジェクト]」またはそれを表示していました。
JSmyth

@ニール、もちろんそれはしません-あなたはそれを拡張する必要があります(;あなたはこの
JSmyth

これは、ログへの最初の引数がフォーマット文字列である一般的なケースでは機能しません
blueFast

@gonvaledは私のコメントを削除しましたが、実際には意味がありませんでした。正解です。このサンプルコードはフォーマット指定子を想定していません。私はここで一歩進んで、さまざまな出力を生成することに基づいて、フォーマット文字列指定子をチェックすることができると思います。
JSmyth 2014

改行をうまく処理する方法はありますか?複数行のメッセージはクロムで複数行に表示されますが、文字列の場合、it文字を含む1つの長い行になります。
Dan Dascalescu 2014年

20

開発ツールプロファイラを使用できます。

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

「タイマー名」は同じでなければなりません。異なる名前のタイマーの複数のインスタンスを使用できます。


console.timeStamp('foo')タイムラインで黄色のポイントとして表示されることもあります。スペースを含む名前を使用すると、うまくいきませんでした。
Vitim.us

これはconsole.log、ログに関する質問やログへの回答にはまったく対応しません
Andreas Dietrich

@AndreasDietrichなんで?コンソールに出力します。2013年のブログ記事blog.mariusschulz.com/2013/11/22/…で
JP Hellemons '23 / 08/23

18

元々はコメントとしてこれを追加しましたが、少なくとも1人がオプションを見つけられなかった(または、何らかの理由で特定のバージョンで使用できなかった)ため、スクリーンショットを追加したいと思いました。

Chrome 68.0.3440.106(および72.0.3626.121でチェックイン)では、

  • オープン開発ツール(F12)
  • 右上のその他メニューをクリックします
  • 設定をクリック
  • 左側のメニューで[設定]を選択します
  • 設定画面のコンソールセクションでタイムスタンプを表示することを確認してください

[設定]> [設定]> [コンソール]> [タイムスタンプを表示]


7

追加したい別の配列を使用できるようにを使用argumentsして配列に変換し、それをに渡します。Array.prototype.sliceconcatconsole.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"]

それargumentsArray.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 2012

6

Google Chromeブラウザを使用している場合は、ChromeコンソールAPIを使用できます。

  • console.time:タイマーを開始するコードのポイントで呼び出します
  • console.timeEnd:タイマーを停止するためにそれを呼び出します

これらの2つの呼び出しの間の経過時間がコンソールに表示されます。

詳細については、ドキュメントリンクをご覧くださいhttps : //developers.google.com/chrome-developer-tools/docs/console


私のように、面倒くさくて調べられない人のために、これを少し拡張します。正しい使い方は次のとおりです。console.time( "myMeasure"); [時間を計るコード] console.timeEnd( "myMeasure");
Samih 2014年

これは、console.logまたはロギングに関する質問にはまったく答えません
Andreas Dietrich

6

Chrome 68から:

「タイムスタンプを表示」を設定に移動

以前にコンソールの設定コンソールの設定に表示タイムスタンプのチェックボックスをに移動したセッティング

ここに画像の説明を入力してください


2
@tekiegirlの回答には、DevTools設定のチェックボックスの場所を示すスクリーンショットがあります。この回答のスクリーンショットでは、[タイムスタンプを表示]チェックボックスの場所がわかりません。
赤エンドウ

4

これも試してください:

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

この関数は組み込みのタイムスタンプ、ファイル名、行番号を組み込みと同じように配置し console.logます。


ׁ logこの方法で作成された関数は、固定されたタイムスタンプをフリーズします。最新の時刻が必要になるたびに、これを再実行する必要があります[= up to time Date;-]。これを関数にすることは可能ですが、mklog()(...)ではなくのように使用する必要がありますlog()
Beni Cherniavsky-Paskin 2014年

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()互換性のフォールバックで、。

レガシーAPI への互換性フォールバックについては、https://github.com/eligrey/Xccessorsを参照してください。どちらのプロパティAPIも機能しない場合は、毎回新しいタイムスタンプを取得するラッパー関数にフォールバックする必要があります。(この場合、行番号情報は失われますが、タイムスタンプは引き続き表示されます。)defineProperty()__defineGetter__


ボイラープレート:私が好きなようにフォーマットする時間:

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

これにより、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);

このようなものを出力します:

[2013年3月11日月曜日16:47:49 GMT]オブジェクト{test: "log"}猿42


2

とても素敵な拡張ソリューション「フォーマット文字列と」 JSmythから支援を

  • 他のすべてconsole.logのバリエーション(logdebuginfowarnerror
  • 含むタイムスタンプ文字列柔軟性のparam(例えば09:05:11.5182018-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 を(オンデマンドでコメントイン/アウトして)有効にすることは意味があるかもしれません
Andreas Dietrich

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
すべての人が理解できるように明確に説明してください。どの機能が何をするか
Yatin Khullar

@YatinKhullarに感謝します。答えを変えました。
A.ロキンスキー

0

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

この:

  • ミリ秒のタイムスタンプを表示します
  • 最初のパラメータとしてフォーマット文字列を想定します .log

これはほとんど問題ありませんがconsole.log(document, window)、フォーマット文字列の仮定がない場合は、smthが得られます。以下のような2014-02-15T20:02:17.284Z > [object HTMLDocument] Window {…}代わりのdocument拡張可能なオブジェクトツリーとして表現されます。
JSmyth 2014

ここで私があなたが持ち出した問題の解決策を見つけようとしところを見てください(時期尚早ですが私の答えも更新しました)。
JSmyth 2014

@JSmyth:確かに、私の改良の要件の1つは、最初の引数がフォーマット文字列であることです。柔軟にするためには、おそらく最初の引数が文字列であることのチェックで十分でしょう。
blueFast 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.