2017-03-23 1 views
0

私はfsに実装されている検索機能を持っているので、クライアントからの入力文字列を各行に基づいて分割すると、server.logが表示される場合は、行に基づいてデータを取得した場合 複数の行最初のイベントが2行であることがわかるので、私の検索に基づいて、それは返されます[2017-03-22T20:25:04Z]|zldv6658|info|bmid: n/a|infra.actorRouter|Adding event to queue: { queue: 'd-email',
そのイベントの2行目が欠場します。どのように私は時間の変数に基づいて完全なデータを得ることができますか?ファイルシステムからの分割を使用してデータの完全なチャンクを取得するには?

searchService.js

async.eachSeries(filesData.logFiles, function(logfile, done) { 
    // read file 
    console.log('SearchEnv in eachSeries', filesData.searchEnv); 
    fs.createReadStream('./logs/' + filesData.searchEnv + '/' + logfile.filename) 
     .pipe(split()) 
     .on('data', function(line) { 
      if (line.toLowerCase().indexOf(searchStr.toLowerCase()) != -1) parseLog(line, prevLine); 
      else prevLine = line; 
     }); 

    function parseLog(line, prev) { 
     // Very rudimentary check... 
     if (line.indexOf('|') === -1) line = prev + line; 
     // Parse as you were doing 
     var messageDateInfo = line.split('|')[0].replace(/[\[\]']+/g, ''); 
     console.log('1st message date is', messageDateInfo) 
     messageDateInfo = new Date(messageDateInfo).getTime(); 
     searchStartDate = new Date(searchStartDate).getTime(); 
     searchEndDate = new Date(searchEndDate).getTime(); 
     console.log('message date is', messageDateInfo) 
     console.log('start date is ', messageDateInfo - searchStartDate); 
     console.log('end date is ', searchEndDate - messageDateInfo); 
     if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { 
      // console.log("message date is within this time range"); 
      results.push({ 
       filename: logfile.filename, 
       value: line 
      }); 
     } 

    } 
    done(); 

}, function(err) { 
    if (err) { 
     console.log('error', err); 
    } 
    // wrong: results.map(result, function (result){ 
    results.map(function(result) { 
     console.log('results'); 
    }); 

    // send back results 
    callback(results); 
    results = []; 
    logFiles = null; 
}); 
} 

のserver.log

[2017-03-22T20:25:04Z]|zldv6658|info|bmid: n/a|infra.actorRouter|Adding event to queue: { queue: 'd-email', 
    msgId: '7eec01e9-6395-4fee-b44f-f09a40e56978' } 
[2017-03-22T20:25:04Z]|zldv6658|info|bmid: n/a|infra.templateActor|Filter match for actor/rule (d-email/email_service) with msgId: 7eec01e9-6395-4fee-b44f-f09a40e56978 
[2017-03-22T20:25:04Z]|zldv6658|info|bmid: 7eec01e9-6395-4fee-b44f-f09a40e56978|mailDispatcher|Received mail event. msgId=7eec01e9-6395-4fee-b44f-f09a40e56978 
[2017-03-22T20:25:04Z]|zldv6658|info|bmid: n/a|mailDispatcher|Mail event with msgId 7eec01e9-6395-4fee-b44f-f09a40e56978 successful: 3 messages delivered 
[2017-03-22T20:25:05Z]|zldv6658|verbose|bmid: n/a|routes.event|Received Event from IP (::ffff:130.9.137.139): 74609753-143b-4e06-845c-9a5721575c19 
{"event":{"header":{"eventSource":"AOTSvTM","timestamp":1481966987000,"eventType":"http://aotsvtm.eventing.att.com/SendEscalationsEvent/V1","entityId":"ENTITYID_1"} 

答えて

0

あなたはfsモジュールで(私はmy other answer to your very similar questionで実証同様にどのように)splitモジュールを使用することができます。

fs.createReadStream(file) 
    .pipe(split()) 
    .on('data', function (line) { 
    //each chunk now is a seperate line! 
    }); 

のドキュメントを参照してください:https://www.npmjs.com/package/split

+0

だから、 'fs.readFIle'の代わりに' fs.createReadStream'を使うべきです。 – hussain

0

あなたのログは、実際に複数行のイベントがある場合は解析中に、あなただけのメモリに前の行(複数可)を保つことができます。また、一度にすべてをメモリにロードしないでください。ストリームを使用して、マシンの負荷を軽減します。

let prevLine; 

fs.createReadStream(file) 
    .pipe(split()) 
    .on('data', function (line) { 
    if (line.toLowerCase().indexOf(searchStr.toLowerCase()) != -1) parseLog(line, prevLine); 
    else prevLine = line; 
    }); 
}); 

function parseLog(line, prev) { 
    // Very rudimentary check... 
    if (line.indexOf('|') === -1) line = prev + line; 
    // Parse as you were doing 
} 

今後の経験則として、シングルラインjsonでビルドすると、ログファイルの管理がはるかに簡単になります。

+0

私はあなたのappraochを使って 'results'の空の配列を返しています。更新された質問 – hussain

+0

'callback(results)'のように見えます – hussain

+0

'id 'を検索すると固定コールバックの問題が発生します。例えば、' 8525366d-3053-485c-bfc9-ea501e2a5449'結果への複数のログ。 – hussain

関連する問題