Bonsoir,
J'ai un problème avec une application NodeJS, en fait cet été j'ai modifié une application de base en l'adaptant à mes souhaits et depuis 2 jours j'suis aller plus loin afin de faire un système d'historiques/logs pour chaque utilisateurs.
Il y a environ 120 utilisateurs et il y a donc prés de 1 ouverture/écriture dans le log toutes les 1 seconde en moyenne, mais j'ai constaté que plus il y a des utilisateurs de connectés (peut-être?!) alors il oubli d'écrire pas mal de lignes dans le txt et c'est pas bon du tout ça.
Voici mon code :
const gracefulFs = require('graceful-fs'); // avec "fs" il y a des erreurs EMFILE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| let filename = DATABASE+nick_original+"-"+hash+"-"+hashmd5(result_rawChannel)+".txt"; // Fichier à créer ou à ouvrir
gracefulFs.open(filename,'r',function(err, fd){ // ouverture du fichier
if (err) {
gracefulFs.writeFile(filename, line+"\n", function(err) { // le fichier n'existe pas, alors on le crée en ajoutant une line
if(err) {
console.log(err);
}
console.log("The file was saved!");
});
} else { // le fichier existe
let output = '';
let readStream = fs.createReadStream(filename);
readStream.on('data', function(chunk) {
output += chunk.toString('utf8'); // récupération de toutes les lignes du txt en les mettant dans "output"
});
readStream.on('end', function() {
console.log('finished reading. Number:', output.split(/\r?\n/).length );
// write to file here.
let splited = output.split(/\r?\n/); // toutes les lignes sont splités avec \r ou \n
let limit = 200; // chaque fichier doit contenir 200 lignes grand maximum (environ)
if (splited.length >= limit) { // dés que le nombre de ligne dépasse 200 lignes alors on supprime les premieres lignes en haut du fichier pour ne garder que les ~200 dernières
var array_last_five;
array_last_five = splited.slice(-limit);
if (splited.length <= limit) {
array_last_five.shift();
}
splited = array_last_five;
let file = fs.createWriteStream(filename); // ouverture du fichier
file.write(splited.join("\n")); // restauration des 200 dernières lignes
file.end();
} else { // si le fichier txt possède moins de 199 lignes alors on rajoute une nouvelle ligne dans le txt avec appendFileSync
gracefulFs.appendFileSync(filename, line+"\n");
}
});
}
}); |
Faut t'il utiliser du asynchrome et du await pour n'oublier aucune ligne ?
Comment il faudrait faire pour écrire en masse dans du txt surtout qu'il y a une écriture/ouverture de fichiers toutes les secondes en moyenne chez prés de 120 utilisateurs connectés simultanément ?
Merci,
Cordialement
Partager