【问题标题】:IE11 truncates string in consoleIE11 在控制台中截断字符串
【发布时间】:2015-03-06 19:41:24
【问题描述】:

我有一串可能有 20 或 30 行的字符串,我想在一个 console.log 调用中全部输出到控制台。这在 Chrome 中效果很好,但 IE11 会截断控制台中大约一半的字符串。有什么办法可以防止这种情况?字符串类似于:

-----------------------------------------
Wed Jan 7 20:41:16 GMT-0700 2015 530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
-----------------------------------------
41:17:181 - Initiating recording...
41:17:233 - Creating NetStream...
41:17:240 - NetStream created.
41:17:240 - Recording ready.
-----------------------------------------
Wed Jan 7 20:41:16 GMT-0700 2015 NetConnectionQueue - rtmp://AMS2alt.commercialtribe.net/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
-----------------------------------------
41:16:867 - Initializing...
41:16:868 - Creating negotiator...
41:17:175 - Connection success: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:175 - Connection added to queue.
41:17:182 - Connection request recieved...
41:17:183 - Connection request fulfilled.
41:17:452 - Connection success: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:452 - Connection added to queue.
41:18:503 - -----------------------------------------
Wed Jan 7 20:41:16 GMT-0700 2015 NetNegotiator Log
-----------------------------------------
41:16:890 - Attempting: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:174 - Negotiator reset
41:17:194 - Attempting: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:282 - Attempting: rtmp://AMS2alt.commercialtribe.net:443/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:339 - Attempting: rtmp://AMS2alt.commercialtribe.net:80/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:400 - Attempting: rtmpt://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:451 - NetConnection attempt failed: rtmp://AMS2alt.commercialtribe.net:443/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9
41:17:452 - Negotiator reset

【问题讨论】:

  • 问题是这是来自我正在处理的 swf 内部的日志。现在我的工作是:var index:int = 0, buffer:int = 1024; var log:String = _logger.log + (_playbackConnectionQueue ? _playbackConnectionQueue.log : '') + _recorderConnectionQueue.log; while ( index < log.length) { ExternalInterface.call("console.error", log.substr(index, index + buffer)); index += buffer; }
  • 顺便说一句,我不认为这是外部接口的事情。我可以很好地从 swf 中获取整个日志,然后来自 js 的正常 console.log/error 会导致相同的截断。

标签: javascript internet-explorer internet-explorer-11 console.log


【解决方案1】:

单个消息的 1024 个字符限制并非完全不合理。即使是这样,IE 也无法改变这种限制。

出于好奇,为什么这是一大块而不是单独调用console.@987654321@console.@987654322@ 分组?

console.group("Wed Jan 7 20:41:16 GMT-0700 2015 530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:181 - Initiating recording...");
console.log("41:17:233 - Creating NetStream...");
console.log("41:17:240 - NetStream created.");
console.log("41:17:240 - Recording ready.");
console.groupEnd();
console.group("Wed Jan 7 20:41:16 GMT-0700 2015 NetConnectionQueue - rtmp://AMS2alt.commercialtribe.net/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:16:867 - Initializing...");
console.log("41:16:868 - Creating negotiator...");
console.log("41:17:175 - Connection success: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:175 - Connection added to queue.");
console.log("41:17:182 - Connection request recieved...");
console.log("41:17:183 - Connection request fulfilled.");
console.log("41:17:452 - Connection success: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:452 - Connection added to queue.");
console.groupEnd();
console.group("Wed Jan 7 20:41:16 GMT-0700 2015 NetNegotiator Log");
console.log("41:16:890 - Attempting: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:174 - Negotiator reset");
console.log("41:17:194 - Attempting: rtmp://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:282 - Attempting: rtmp://AMS2alt.commercialtribe.net:443/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:339 - Attempting: rtmp://AMS2alt.commercialtribe.net:80/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:400 - Attempting: rtmpt://AMS2alt.commercialtribe.net:1935/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:451 - NetConnection attempt failed: rtmp://AMS2alt.commercialtribe.net:443/recorder/530d8aa855df0c2d269a5a5853a47a049c52c9d83a2d71d9");
console.log("41:17:452 - Negotiator reset");
console.groupEnd();

如果消息是作为一个大字符串接收的,您当然可以将其记录为较小的片段:

function processChunks(sliceable, chunkSize, callback) {
  var i = 0,
    n = sliceable.length;
  while (i < n) {
    callback(sliceable.slice(i, i += chunkSize));
  }
}
// small sample with chunkSize of 7
processChunks("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 7, console.log);
&lt;script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"&gt;&lt;/script&gt;&lt;script&gt;console.config({maximize:true,timeStamps:false})&lt;/script&gt;&lt;style&gt;.as-console-wrapper{display:block;}&lt;/style&gt;

【讨论】:

  • 这是一个很好的答案;在处理相关输出时,用户确实应该使用console.log within console.group。正如您所指出的,1024 个字符应该足以传达单个日志消息。
  • 在 IE11 示例中可能不应该使用箭头函数,因为那样只会引发语法错误。
【解决方案2】:

我知道这是一个老问题,但只是发布以防万一这有助于找到它的任何人。

如果您像我一样,只是想确保将所有正确的数据放入字符串中以进行简单测试,您可以这样做。也许有点复杂,但当我需要检查一个长字符串时,它的格式是否正确并且内容是否正确时很有帮助。 您绝对可以将其与接受的(佳能)答案中提到的 console.group() 配对。

function consoleLog(str, blockSize) {
    // blockSize is a parameter only to support the tests.
    if (blockSize === undefined) {
        blockSize = 1024;
    }
    var limit = Math.floor(str.length / blockSize);
    for (var k = 0; k < limit+1; k++) {
      if (k == limit)
          console.log(str.substring(blockSize*k, str.length));
      else
          console.log(str.substring(blockSize*k, blockSize*(k+1)));
    }
}

// Tests.

// Should print:
// aaaaa
// bbbbb
// c
consoleLog('aaaaabbbbbc', 5);

// Should print:
// aaaaa
// bbbbb
consoleLog('aaaaabbbbb', 5);

【讨论】:

  • 不错的答案 - 帮助我调试了一个愚蠢的 IE 问题。这个函数似乎把字符放在了块之间——虽然“...SQL...”转到“...S”和“L...”。
【解决方案3】:

如果你应该记录的文本没有分成几行,或者行可能超过限制,你可以使用这个简单的函数来“格式化”日志输出:

function logMessage(title, message) {
    // make sure if the 'console' object and its methods are available,
    // to avoid issues, like your JS code is broken by logging.
    // see: https://stackoverflow.com/a/7742862/704022
    if (console && console.log && console.group && console.groupEnd) {
        var maxLength = 10; // set to 10 to enable easier testing, should be 1024
        console.group(title);
        for (var pos = 0; pos < message.length ; pos += maxLength) {
            console.log(message.substring(pos, pos + maxLength));
        }
        console.groupEnd();
    }
}

logMessage("Test", "0123456789012345678901234");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多