Chromeにconsole.log
書き込みでタイムスタンプを出力させる簡単な方法はありますか(Firefoxのように)。または、先頭new Date().getTime()
に追加する唯一のオプションですか?
Chromeにconsole.log
書き込みでタイムスタンプを出力させる簡単な方法はありますか(Firefoxのように)。または、先頭new Date().getTime()
に追加する唯一のオプションですか?
回答:
Chromeでは、「タイムスタンプを表示」というオプションがコンソール設定(開発者ツール->コンソール->設定[右上隅])にあり、これがまさに私が必要とするものです。
見つけたところです。プレースホルダーを破壊し、メッセージが記録されたコード内の場所を消去する他のダーティーハックは必要ありません。
[タイムスタンプを表示]設定は、DevToolsドロワーの右上隅にある[DevTools設定]の[設定]ペインに移動しました。
これを試して:
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
一連のオブジェクトではなくオブジェクトの配列としてログに記録されるため、ここでは完全ではありません。
開発ツールプロファイラを使用できます。
console.time('Timer name');
//do critical time stuff
console.timeEnd('Timer name');
「タイマー名」は同じでなければなりません。異なる名前のタイマーの複数のインスタンスを使用できます。
console.timeStamp('foo')
タイムラインで黄色のポイントとして表示されることもあります。スペースを含む名前を使用すると、うまくいきませんでした。
console.log
、ログに関する質問やログへの回答にはまったく対応しません
追加したい別の配列を使用できるようにを使用arguments
して配列に変換し、それをに渡します。Array.prototype.slice
concat
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"]
それarguments
もArray.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"]
+new Date
およびDate.now()
タイムスタンプを取得するための別の方法があります
Google Chromeブラウザを使用している場合は、ChromeコンソールAPIを使用できます。
これらの2つの呼び出しの間の経過時間がコンソールに表示されます。
詳細については、ドキュメントリンクをご覧ください:https : //developers.google.com/chrome-developer-tools/docs/console
これも試してください:
this.log = console.log.bind( console, '[' + new Date().toUTCString() + ']' );
この関数は組み込みのタイムスタンプ、ファイル名、行番号を組み込みと同じように配置し console.log
ます。
log
この方法で作成された関数は、固定されたタイムスタンプをフリーズします。最新の時刻が必要になるたびに、これを再実行する必要があります[= up to time Date;-]。これを関数にすることは可能ですが、mklog()(...)
ではなくのように使用する必要がありますlog()
。
行番号情報(すべてのメッセージがラッパーを指すのではなく、.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); }
これにより、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
とても素敵な拡張ソリューション「フォーマット文字列と」 JSmythからも支援を
console.log
のバリエーション(log
、debug
、info
、warn
、error
)09:05:11.518
対2018-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'
Utl.js
上記の場所が表示されることです。したがって、Utl.consoleWithTimestamps(...)
-override を(オンデマンドでコメントイン/アウトして)有効にすることは意味があるかもしれません
ES6ソリューション:
const timestamp = () => `[${new Date().toUTCString()}]`
const log = (...args) => console.log(timestamp(), ...args)
ここで、timestamp()
実際にフォーマットされたタイムスタンプを返しlog
、タイムスタンプを追加して、すべての独自の引数をconsole.log
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
拡張可能なオブジェクトツリーとして表現されます。