Nodejs監視ログファイルの変化の過程解析

8250 ワード

最近はログファイルの分析をしていますが、AサーバプロジェクトはNodejsでログファイルの変化をモニターする必要があります.プロジェクトに新しいログ情報が発生したら、新しい部分をsocketでBサーバプロジェクトに転送します.socketはしばらく分析をしません.
この需要はとても簡単です.分析を通して、シャベルを始めましょう.シムコードを使用する過程で、学習したNodejsのAPIを強固にすることができます.
使用するAPIfs.watchFile()構文fs.watchFile(filename[, options], listener)パラメータ解析

filename  |  |  ――   
options 

 persistent     : true。――        
 interval     : 5007。――       
listener 

 current  ――   
 previous  ――   
filenameの変更を監視します.ファイルにアクセスするたびに、listenerコールを行います.
listenerには二つのパラメータがあります.現在のstatオブジェクトと以前のstatオブジェクトです.
これらのstatオブジェクトは、fs.Statの例である.
ファイルの変更(アクセスだけではなく)時に通知を受けるには、curr.mtimeとprev.mtimeを比較する必要があります.
fs.watFileの操作によりENOENTエラーが発生した場合、モニターを呼び出し、すべてのフィールドをゼロにする(または日付をUnix紀元に設定する).ファイルがその後に作成された場合、モニターは再度呼び出しられ、最新のstatオブジェクトを持参します.これはv 0.10以降の機能変化です.
fs.watchを使用することは、 fs.watchFile および fs.unwatchFile よりも効率的である.fs.watchの代わりに、できるだけfs.watch Fileとfs.unwatch Fileを使うべきです.
fs.watFile()が監視しているファイルが消えて再出現した場合、第2のコールバックイベント(ファイル再出現)が戻ったprevious Statは、第1回のコールイベント(ファイル消失)が戻ったprevious Statと同じです.
このような状況は以下の通りです.
  • ファイルは削除され、また復元される.
  • ファイルは2回名前を変えられ、2回目の名前が元の名前に戻る.
  • 
    fs.watchFile('message.text', (curr, prev) => {
     console.log(`          : ${curr.mtime}`);
     console.log(`          : ${prev.mtime}`);
    });
    fs.open()
    構文fs.open(path[, flags[, mode]], callback)パラメータ解析
    
    path  |  |  ――    
    flags  |     : 'r'。――      
    mode     : 0o666(   )。――      (      ),           
    callback 
    
     err  ――  
     fd ――     
    
    fs.read()
    構文fs.read(fd, buffer, offset, length, position, callback)パラメータ解析
    
    fd  ――     
    buffer  |  | ――         
    offset ―― buffer          
    length ――       
    position ――           
    callback 
    
     err 
     bytesRead 
     buffer 
    
    fs.reat ReadStream()
    構文fs.createReadStream(path[, options])パラメータ解析
    
    path  |  | ――    
    options  | 
    
     flags     : 'r'。――      
     encoding     : null。――    
     fd     : null。――     
     mode     : 0o666。――      (      ),           
     autoClose     : true。――           
     start ――         
     end     : Infinity。――         
     highWaterMark     : 64 * 1024。
    は、読み取り可能なストリームを参照してください.
    atoCloseがfalseであれば、エラーがあってもファイル記述子を閉じません.アプリケーションは、ファイルのディスクリプタが漏洩していないことを確認するためにシャットダウンします.atoCloseをtrueとすると、「error」または「end」イベントの時に自動的にファイルのディスクリプタが閉じられます.
    modeはファイルモード(権限とスティッキービット)を設定するために使用されますが、ファイルを作成する場合に限ります.

    sample.txtファイルの10文字を読みだします.fs.createReadStream('sample.txt', { start: 90, end: 99 });readLine.createInterface
    構文readline.createInterface(options)パラメータ解析
    options
      inputは傍受したい読み取り可能なストリームです.このオプションが必要です.  out putは、行ごとに読出しデータを書き込む書き込み可能なストリームです.  completterはTab自動補完のためのオプション関数です.  terminalはinputとoutputをTTYと見なすべきであり、ANSI/VT 100変換コードを書き込むとtrueとなる.デフォルト値:実装時に、Outputストリーム上でisTTYをチェックします.  historySizeが保持する最大履歴行数.履歴を無効にするには、この値を0に設定してください.ユーザまたは内部outputチェックがterminalをtrueに設定している場合にのみ、このオプションは意味があります.そうでないと履歴キャッシュメカニズムは初期化されません.標準値:30  prompt-使用するヒント文字列.標準値:'''  crlfDelay\rとの間の遅延がcrlfDelayミリ秒を超えると、\rとは別の行末入力と見なされる.  crlfDelayは強制的に100以下の数字に変換されます.Infinityに設定できます.この場合、\rの後は常に単一の改行符と見なされます.標準値:100  removeHistoryDuplicatesがtrueであれば、履歴リストに追加された新しい入力行と古い入力行が重複した場合、リストから古い行を削除します.デフォルト:false  escapeCodeTimeout readlineは、文字の継続時間を待つ(ミリ秒単位でぼかしキーシーケンスを読み出す場合、入力を使用してこれまでの完全なキーシーケンスを読み取ることができ、さらに長いキーシーケンスを達成するために追加の入力を行うことができる).標準値:500
    ファイルシステムフラグ
    これは運転手がいらないです.よくあるのを覚えてください.必要な時に探してください.
    flagsオプションが文字列を使用する場合、以下のフラグが使用できます.
    'a'-ファイルを開いて、追加のために使います.ファイルが存在しない場合は、このファイルを作成します.
    'ax'-は'a'に似ていますが、パスが既に存在すると失敗します.
    'a+'-ファイルを開いて読み込みと追加に使います.ファイルが存在しない場合は、このファイルを作成します.
    'ax+'-は'a+'と似ていますが、パスが既に存在すると失敗します.
    'as'-同期モードでファイルを開いて、追加のために使います.ファイルが存在しない場合は、このファイルを作成します.
    'as+'-同期モードでファイルを開いて読み込みと追加に使います.ファイルが存在しない場合は、このファイルを作成します.
    'r'-読み取りのためにファイルを開きます.ファイルが存在しないと異常が発生します.
    'r+'-読み取りと書き込みのためにファイルを開きます.ファイルが存在しないと異常が発生します.
    'rs+'-同期モードでファイルを開いて読み込みと書き込みに使います.オペレーティングシステムがローカルのファイルシステムキャッシュをバイパスすることを示します.
    これは、古いローカルキャッシュをスキップすることができるので、NFSマウント上でファイルを開くときに有用である.I/Oの性能には非常に実際的な影響がありますので、必要でない限り、このマークの使用を推奨しません.
    これは、fs.open()またはfs Promises.open()を同期のブロッキングコールに変換しません.同期の操作が必要なら、fs.openSync()などを使います.
    'w'-書き込みのためにファイルを開きます.ファイルが存在しない場合はファイルを作成し、ファイルが存在する場合はファイルを切断します.
    'wx'-は'w'に似ていますが、パスが存在すると失敗します.
    'w+'-ファイルを開いて読み込みと書き込みに使います.ファイルが存在しない場合はファイルを作成し、ファイルが存在する場合はファイルを切断します.
    'wx+'-は'w+'と似ていますが、パスが既に存在している場合は失敗します.
    fs.Stts類
    fs.Sttsオブジェクトはファイルに関する情報を提供します.
    
    Stats {
     dev: 2114,
     ino: 48064969,
     mode: 33188,
     nlink: 1,
     uid: 85,
     gid: 100,
     rdev: 0,
     size: 527,
     blksize: 4096,
     blocks: 8,
     atimeMs: 1318289051000.1,
     mtimeMs: 1318289051000.1,
     ctimeMs: 1318289051000.1,
     birthtimeMs: 1318289051000.1,
     atime: Mon, 10 Oct 2011 23:24:11 GMT,
    mtime: Mon, 10 Oct 2011 23:24:11 GMT,
      ctime: Mon, 10 Oct 2011 23:24:11 GMT,
      birthtime: Mon, 10 Oct 2011 23:24:11 GMT }
     ログファイルの待ち受けを開始します.
    前提として、app.jsでwatch File方法を呼び出し、監聴が必要なファイルパスをこの方法に導入する.
    
    function watchFile(filename) {
     console.log('Log monitoring...');
     // Open the file for reading and appending
     fs.open(filename, 'a+', function (err, fd) {
     if (err) {
      throw err;
     }
     var buffer;
     fs.watchFile(filename, {
      persistent: true,
      interval: 1000
     }, (curr, prev) => {
      // Compare the time before and after
      if (curr.mtime > prev.mtime) {
      // console.log(`The current latest revision time is: ${curr.mtime}`);
      // console.log(`The latest modification time is: ${prev.mtime}`);
    
      // Changes in the contents of documents
      buffer = new Buffer(curr.size - prev.size);
       // (curr.size - prev.size) this is the newly added length of the log file
      readFile(fd, buffer, (curr.size - prev.size), prev.size);
      }
     });
     });
    
    }
    新規コンテンツの読み込み
    
    function readFile(fd, buffer, length, position) {
     // read file
     fs.read(fd, buffer, 0, length, position, function (err, bytesRead, buffer) {
     if (err) {
      log.error(err);
     }
     console.log('Additional Contents', buffer.toString());
     });
    }
    追加機能:履歴内容の読み込み
    
    function fetchHistoryLogs(filename) {
     const rl = readLine.createInterface({
     input: fs.createReadStream(filename, {
      enconding: 'utf8'
     }),
     output: null,
     terminal: false
     });
    
     rl.on('line', (line) => {
     if (line) {
      logsArr.push(line.toString());
     }
     }).on('close', () => {
     for (var i = 0; i < logsArr.length; i++) {
      // Print the data for each row
      console.log(`Original data: 
    ${logsArr[i]}`); } }); }
    締め括りをつける
    以上述べたのは小编が皆さんに绍介したNodejs监视ログファイルの変化の过程解析です.皆さんに助けてほしいです.もし何か疑问があれば、メッセージをください.小编はすぐに返事します.