Node.js surveille les modifications et les parsing

J’ai besoin de surveiller un fichier pour les changements. En raison d’une grande quantité de nouvelles entrées dans ce fichier, je devrais «surveiller» ce fichier. J’aurais besoin d’obtenir le nouveau contenu inséré dans ce fichier pour pouvoir parsingr ce contenu.

J’ai trouvé ce code:

fs.watchFile('var/log/query.log', function() { console.log('File Changed ...'); //how to get the new line which is now inserted? }); 

Sur Bash, vous feriez quelque chose comme ça avec tail --follow .

Il y a aussi un paquet tail disponible. vous pouvez regarder un fichier et obtenir de nouvelles lignes avec un événement:

 const Tail = require('tail').Tail; var tail = new Tail("var/log/query.log"); tail.watch() tail.on("line", data => { console.log(data); }); 

Voici un exemple d’utilisation de fs.watchFile pour surveiller un fichier journal d’un jeu appelé Hearthstone et récupérer de nouvelles entrées de journal pour surveiller les événements du jeu lors de leur lecture. https://github.com/chevex-archived/hearthstone-log-watcher/blob/master/index.js

 var fs = require('fs'); var options = { logFile: '~/Library/Preferences/Blizzard/Hearthstone/log.config', endOfLineChar: require('os').EOL }; // Obtain the initial size of the log file before we begin watching it. var fileSize = fs.statSync(options.logFile).size; fs.watchFile(options.logFile, function (current, previous) { // Check if file modified time is less than last time. // If so, nothing changed so don't bother parsing. if (current.mtime <= previous.mtime) { return; } // We're only going to read the portion of the file that // we have not read so far. Obtain new file size. var newFileSize = fs.statSync(options.logFile).size; // Calculate size difference. var sizeDiff = newFileSize - fileSize; // If less than zero then Hearthstone truncated its log file // since we last read it in order to save space. // Set fileSize to zero and set the size difference to the current // size of the file. if (sizeDiff < 0) { fileSize = 0; sizeDiff = newFileSize; } // Create a buffer to hold only the data we intend to read. var buffer = new Buffer(sizeDiff); // Obtain reference to the file's descriptor. var fileDescriptor = fs.openSync(options.logFile, 'r'); // Synchronously read from the file starting from where we read // to last time and store data in our buffer. fs.readSync(fileDescriptor, buffer, 0, sizeDiff, fileSize); fs.closeSync(fileDescriptor); // close the file // Set old file size to the new size for next read. fileSize = newFileSize; // Parse the line(s) in the buffer. parseBuffer(buffer); }); function stop () { fs.unwatchFile(options.logFile); }; function parseBuffer (buffer) { // Iterate over each line in the buffer. buffer.toString().split(options.endOfLineChar).forEach(function (line) { // Do stuff with the line :) }); }; 

Il calcule d’abord la taille initiale du fichier car dans ce module de surveillance du journal, je souhaite uniquement lire les nouvelles données au fur et à mesure de leur écriture par le jeu. Je me fiche des données existantes. Il commence alors à regarder le fichier pour les changements. Lorsque le gestionnaire de modifications se déclenche, nous vérifions si l'heure de modification est vraiment plus récente, car d'autres modifications apscopes au fichier peuvent déclencher le gestionnaire lorsqu'aucune donnée qui nous tient à cœur n'a réellement été modifiée. Nous voulions que cet observateur soit aussi performant que possible.

Nous lisons ensuite la nouvelle taille du fichier et calculons la différence par rapport à la dernière fois. Cela nous indique exactement combien de données à lire à partir du fichier pour obtenir uniquement les données nouvellement écrites. Ensuite, nous stockons les données dans un tampon et les analysons comme une chaîne. Il suffit de scinder la chaîne par des caractères de nouvelle ligne. Utiliser core module os pour obtenir os.EOL vous donnera le bon caractère de fin de ligne pour le système d’exploitation que vous utilisez (le caractère de fin de ligne Windows est différent de linux / unix).

Maintenant, vous avez un tableau de lignes écrites dans le fichier 🙂