2016-05-27 54 views
0

我試圖做一個日誌解析器,每10秒更新一次日誌。它主要是功能性的,但是當我嘗試更新它時,它只是再次附加整個日誌,而不僅僅是新數據。只追加新的數據

我的javascript:

$(document).ready(function() { 

var data; 
var lines; 

$.ajax({ 
async: false, 
type: 'GET', 
url: 'test.log', 
success: function(log) {\ 
    data = log; 
    lines = data.split("\n"); 
    console.log("Received log"); 
} 
}); 

function updateLog() 
{ 
    $.ajax({ 
    async: false, 
    type: 'GET', 
    url: 'test.log', 
    success: function(log) { 
     data = log.replace(data, ""); 
     lines = log.split("\n"); 

     console.log("Received log"); 
     } 
    }); 

    $.each(lines, function(n, elem) 
    { 
     $('#text').append('<div>' + elem + '</div>'); 
    }); 
} 



$.each(lines, function(n, elem) 
{ 
    $('#text').append('<div>' + elem + '</div>'); 
}); 


    setInterval(function(){updateLog();}, 10000); 
}); 

例test.log中的內容:

Hello 
How are you? 

但不是隻增加潛在的新線路,它只是複製了整個事情,即使我認爲它不該」因爲replace,這應該採取舊的data並將其更改爲''新數據(只留下新行)。

回答

1

它看起來像你對我只保存最後一次請求data的新零件,所以你實際上只更換日誌的一部分,這是新的,你最後一次更新日誌由空字符串組成。此外,您並未使用data而是使用log(這是完整日誌)來計算lines,並將lines中的所有行附加到您的div。

我覺得這樣的事情應該工作:

$(document).ready(function() { 
    var processed_data = ''; 
    function updateLog() { 
     $.ajax({ 
      async: false, 
      type: 'GET', 
      url: 'test.log', 
      success: function(log) { 
       var new_data = log.replace(processed_data, ''); 
       processed_data = log; 
       console.log("Received log"); 
       var lines = new_data.split('\n'); 
       $.each(lines, function(n, elem) { 
        $('#text').append('<div>' + elem + '</div>'); 
       }); 
      } 
     }); 
    } 
    updateLog(); 
    setInterval(function(){updateLog();}, 10000); 
}); 

請注意,我也擺脫了一些代碼重複,這是你的榜樣由剛上載調用updateLog()而不是複製它的內容。

跟蹤已經打印的日誌部分的長度也可能更有效。事情是這樣的:

$(document).ready(function() { 
    var processed_data_length = 0; 
    function updateLog() { 
     $.ajax({ 
      async: false, 
      type: 'GET', 
      url: 'test.log', 
      success: function(log) { 
       var new_data = log.substring(processed_data_length, log.length); 
       processed_data_length = log.length; 
       console.log("Received log"); 

       $.each(lines, function(n, elem) { 
        $('#text').append('<div>' + elem + '</div>'); 
       }); 
      } 
     }); 
    } 
    updateLog(); 
    setInterval(function(){updateLog();}, 10000); 
}); 
+0

我修正了一些語法問題和定義'lines'。第一個解決方案運行良好,但第二個解決方案沒有。如果我在日誌中添加':DD',它會打印':D',然後繼續創建新的DIV/D行。謝謝。 – PMint

+0

很高興你喜歡它。我提出了建議的編輯。我認爲第二個解決方案現在應該是固定的;我得到了傳遞給substring的索引的細節,包含/排他性錯誤。 – Semafoor

0

字符串是不可變的,所以日誌變量不會被.replace()調用更新。在Ajax也許應該是這樣的:

$.ajax({ 
    async: false, 
    type: 'GET', 
    url: 'test.log', 
    success: function(log) { 
     data = log.replace(data, ""); 
     lines = data.split("\n"); 

     console.log("Received log"); 
     } 
    });