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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
const gracefulFs = require('graceful-fs'); // avec "fs" il y a des erreurs EMFILE
Code js : Sélectionner tout - Visualiser dans une fenêtre à part
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