console.log timestamps ใน Chrome หรือไม่


235

มีวิธีใดที่รวดเร็วในการทำให้ Chrome ส่งออกการประทับเวลาเป็นลายลักษณ์อักษรconsole.log(เช่นเดียวกับ Firefox) หรือกำลังเติมnew Date().getTime()ตัวเลือกเท่านั้น?


1
คุณช่วยเปลี่ยนคำตอบที่ยอมรับได้ไหม อันดับที่สองที่โหวตมากที่สุดนั้นง่ายกว่ามาก
Liron Yahdav

ดูเหมือนว่า Chrome จะเปลี่ยนวิธีเปิดเครื่อง ดูgithub.com/Microsoft/vscode/issues/61298#issuecomment-431422747
itsthetaste

คำตอบ:


425

ใน Chrome มีตัวเลือกคือการตั้งค่าคอนโซล (เครื่องมือสำหรับนักพัฒนา -> คอนโซล -> การตั้งค่า [มุมบนขวา]) ชื่อ "แสดงการประทับเวลา" ซึ่งเป็นสิ่งที่ฉันต้องการ

ฉันเพิ่งพบมัน ไม่มีแฮ็กสกปรกอื่น ๆ ที่ต้องการทำลายตัวยึดตำแหน่งและลบสถานที่ในรหัสที่ข้อความถูกบันทึกไว้

อัปเดตสำหรับ Chrome 68+

การตั้งค่า "Show timestamps" ถูกย้ายไปที่บานหน้าต่าง Preferences ของ "DevTools settings" ซึ่งอยู่ที่มุมขวาบนของลิ้นชัก DevTools:

ป้อนคำอธิบายรูปภาพที่นี่


3
ตามที่ @Krzysztof Wolny ชี้ให้เห็นแล้วตอนนี้ได้ติดตั้ง Chrome 35 DevTools แล้ว (Yay!) เปิดใช้งานโดยเปิดเครื่องมือนักพัฒนาซอฟต์แวร์ (เช่น F12 หรือ "ตรวจสอบองค์ประกอบ") คลิกที่ "เฟือง" เพื่อดูการตั้งค่าจากนั้นทำเครื่องหมายในช่อง "แสดงการประทับเวลา" ในส่วน "คอนโซล" ! เปิดใช้งานการตั้งค่าการประทับเวลาใน devtools 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 ฉันต้องเปิดเครื่องมือ dev (F12)> คลิกเมนูสามจุดที่ด้านบนขวา> คลิกการตั้งค่า> เลือกการตั้งค่าในเมนูด้านซ้าย> ตรวจสอบการประทับเวลาในส่วนคอนโซลของหน้าจอการตั้งค่า (บนขวา )
tekiegirl

5
70.0.3538.110 (รุ่นเป็นทางการ) (64 บิต) คำตอบนี้ใช้ได้สำหรับฉันแล้ว: เช่นคอนโซล "ไอคอนเฟือง"; เครื่องหมายถูก "แสดงการประทับเวลา" ... แต่ตอนนี้ฉันไม่เห็น "แสดงการประทับเวลา"ใน Chrome 70.0.3538.110 (รุ่นเป็นทางการ) (64 บิต) ดังนั้นฉันจึงลองใช้คำแนะนำของ @ tekiegirl อีกครั้ง: Chrome 68: ie เครื่องมือ dev แบบเปิด (F12 )> คลิกเมนูสามจุดที่ด้านบนขวา> คลิกการตั้งค่า> เลือกการตั้งค่าในเมนูด้านซ้าย> ตรวจสอบเวลาบันทึกการแสดง ... แต่ฉันไม่เห็น "การตั้งค่า"ในเมนูด้านซ้ายของการตั้งค่า 70.0.3538.110 ) (64-bit)
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

@ รูปแบบที่ถูกลบความคิดเห็นของฉันมันไม่สมเหตุสมผล - ขาดกาแฟในเลือด คุณถูกต้องรหัสตัวอย่างนี้ไม่ถือว่าตัวระบุรูปแบบ ฉันคิดว่าเราสามารถออกไปที่ขาที่นี่และตรวจสอบตัวระบุสตริงรูปแบบตามที่สร้างผลลัพธ์ที่แตกต่างกัน
JSmyth

มีวิธีจัดการกับการขึ้นบรรทัดใหม่หรือไม่? ข้อความหลายบรรทัดแสดงขึ้นบนหลายบรรทัดโดย chrome แต่เมื่ออยู่ในสตริงข้อความนั้นจะกลายเป็นบรรทัดยาวหนึ่งบรรทัดที่มีอักขระ in อยู่
Dan Dascalescu

20

คุณสามารถใช้เครื่องมือ dev profiler

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

18

ฉันเพิ่มสิ่งนี้เป็นความคิดเห็น แต่ฉันต้องการเพิ่มภาพหน้าจอเนื่องจากอย่างน้อยหนึ่งคนไม่สามารถหาตัวเลือกได้ (หรืออาจจะไม่สามารถใช้งานได้ในบางรุ่น)

บน Chrome 68.0.3440.106 (และตอนนี้ตรวจสอบใน 72.0.3626.121) ฉันต้อง

  • เครื่องมือ dev แบบเปิด (F12)
  • คลิกเมนูสามจุดที่ด้านบนขวา
  • คลิกการตั้งค่า
  • เลือกการตั้งค่าในเมนูด้านซ้าย
  • ตรวจสอบการแสดงเวลาประทับในส่วนคอนโซลของหน้าจอการตั้งค่า

การตั้งค่า> ค่ากำหนด> คอนโซล> แสดงการประทับเวลา


7

ฉันแปลง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"]

6

+new DateและDate.now()เป็นวิธีอื่นในการรับการประทับเวลา


ขอบคุณ +1 แต่ฉันหวังว่าอาจมีการสนับสนุนบางอย่างโดยไม่ต้องเพิ่มรหัส
UpTheCreek

6

หากคุณใช้เบราว์เซอร์ Google Chrome คุณสามารถใช้ chrome console api:

  • console.time: เรียกมันที่จุดในรหัสของคุณที่คุณต้องการเริ่มจับเวลา
  • console.timeEnd: เรียกมันเพื่อหยุดจับเวลา

เวลาที่ผ่านไประหว่างการโทรสองครั้งนี้จะปรากฏในคอนโซล

สำหรับข้อมูลรายละเอียดโปรดดูลิงก์ doc: https://developers.google.com/chrome-developer-tools/docs/console


หากต้องการขยายตัวเพียงเล็กน้อยสำหรับผู้ที่ชอบฉันขี้เกียจเกินไปที่จะไปและค้นหามัน การใช้งานที่ถูกต้องคือ: console.time ("myMeasure"); [รหัสที่คุณต้องการเวลา] console.timeEnd ("myMeasure");
Samih

นี่ไม่ได้ตอบคำถามที่เกี่ยวข้องกับ console.log หรือการบันทึกทั้งหมด
Andreas Dietrich

6

จาก Chrome 68:

ย้าย "Show timestamps" ไปที่การตั้งค่า

แสดง timestamps ช่องทำก่อนหน้านี้ในการตั้งค่าคอนโซลคอนโซลการตั้งค่าได้ย้ายไปตั้งค่า

ป้อนคำอธิบายรูปภาพที่นี่


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

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()งานได้ดี

ดูhttps://github.com/eligrey/Xccessorsเพื่อดูความเข้ากันได้ของข้อผิดพลาดตั้งแต่defineProperty()ถึงดั้งเดิม__defineGetter__API หากคุณสมบัติ API ไม่ทำงานคุณควรเลือกฟังก์ชัน wrapper ที่ได้รับการประทับเวลาใหม่ทุกครั้ง (ในกรณีนี้คุณสูญเสียข้อมูลหมายเลขบรรทัด แต่การประทับเวลาจะยังคงแสดงอยู่)


Boilerplate: การจัดรูปแบบเวลาตามที่ฉันชอบ:

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

แสดงผลแบบนี้:

[จันทร์, 11 มีนาคม 2556 16:47:49 GMT] วัตถุ {ทดสอบ: "บันทึก"} ลิง 42


2

ขยายโซลูชันที่ดีมาก"ด้วยสตริงรูปแบบ"จาก JSmythไปยังสนับสนุน

  • ทั้งหมดอื่น ๆconsole.logรูปแบบ ( log, debug, info, warn,error )
  • รวมถึงพารามิเตอร์ความยืดหยุ่นสตริงเวลาประทับ (เช่น09:05:11.518vs. 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'

ข้อเสียว่าเป็นที่ (เช่นใน 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. Rokinsky

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

ดูที่นี่ที่ฉันพยายามค้นหาวิธีแก้ไขปัญหาที่คุณนำมาปรับปรุง (ปรับปรุงคำตอบของฉัน แต่ก่อนกำหนด)
JSmyth

@JSmyth: แน่นอนนั่นคือสาเหตุหนึ่งในข้อกำหนดของการปรับแต่งของฉันคืออาร์กิวเมนต์แรกคือสตริงรูปแบบ เพื่อให้มีความยืดหยุ่นการตรวจสอบอาร์กิวเมนต์แรกของสตริงอาจเพียงพอ
blueFast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.