Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment écraser contenu fichier avec Boost Log ?

    18 juillet 2024 à 11:48:21

    Salut tout le monde ! :pirate:

    Est-ce que quelqu'un sait s'il est possible d'écrire dans un fichier de log en effaçant son contenu avec Boost Log ?

    En gros, faire l'équivalent de ce code :

    #include <fstream>
    #include <iostream>
    
    
    int main() {
      std::string filename("test.log");
      std::ofstream s(filename, std::ios::out | std::ios::trunc);
    
      if (!s.is_open()) {
        std::cout << "failed to open (1st try) " << filename << "\n";
      } else {
        s << "Foo";
        s.close();
      }
    
      std::ofstream s2(filename, std::ios::out | std::ios::trunc);
    
      if (!s2.is_open()) {
        std::cout << "failed to open (2nde try) " << filename << "\n";
      } else {
        s2 << "Bar";
        s2.close();
      }
    }


    test.log contient :

    Bar

    J'ai essayé d'implémenter un code similaire avec Boost en utilisant le mode std::ios_base::trunc pour essayer d'avoir le même résultat mais sans succès :

    #include <boost/log/trivial.hpp>
    #include <boost/log/sinks/text_file_backend.hpp>
    #include <boost/log/utility/setup/file.hpp>
    
    namespace logging = boost::log;
    namespace sinks = boost::log::sinks;
    namespace keywords = boost::log::keywords;
    
    
    int main() {
        typedef sinks::synchronous_sink<sinks::text_file_backend> FileSink;
        boost::shared_ptr<FileSink> sink = boost::make_shared<FileSink>(
            keywords::file_name = "test.log",
            keywords::open_mode = std::ios_base::trunc
        );
        logging::core::get()->add_sink(sink);
    
        BOOST_LOG_TRIVIAL(info) << "Foo";
        BOOST_LOG_TRIVIAL(info) << "Bar";
    
        return 0;
    }

    test.log contient :

    Foo
    Bar


    Il faudrait fermer puis réouvrir le fichier pour que Boost écrase le fichier mais je n'arrive pas à trouver comment faire.

    Sinon j'efface le fichier avec la stdlib mais bon c'est peut-être pas optimal de mélanger du code Boost et std.

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2024 à 12:02:57

      Parce que la question semble etre une question de nouveau projet: à date, très grosse préférence pour https://github.com/gabime/spdlog

      Sinon, tu peux toujours effacer le fichier avant de démarrer ton log

      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        18 juillet 2024 à 13:48:22

        Merci pour la recommandation ! Malheureusement je ne travaille pas sur un nouveau projet mais je prends note. :pirate:

        Ok je pense que je vais juste effacer le fichier dans ce cas.

        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2024 à 16:47:01

          Ah zut ça ne marche pas correctement finalement !

          J'ai ajouté ce code pour effacer complètement le contenu de test.log :

          std::ofstream ofs;
          ofs.open(testLogFilePath, std::ofstream::out | std::ofstream::trunc);
          ofs.close();

          Mais ensuite lorsque Boost Log re-dumpe un log dans test.log il ajoute une grande quantité de "00" bits juste devant le 1er log! Il doit y avoir un problème. Boost Log ne doit pas être conçu pour écrire dans un fichier également manipulé par un autre programme. :'(

          • Partager sur Facebook
          • Partager sur Twitter
            19 juillet 2024 à 11:55:45

            Non, ce n'est pas le contenu du fichier que tu dois supprimer.
            C'est le fichier lui même, et ce avant toute opération d'ouverture / écriture.
            Je suppose que boost::log sera capable de gérer l'absence du fichier de log le cas échéant.

            De plus, interférer avec les ressources sous contrôle d'une classe est tout sauf une bonne idée.
            En effet, cette dernière n'a aucun moyen de détecter les "instrusions" (et ce n'est pas son job).
            Autant éditer une DLL avec Notepad, tu m'en diras des nouvelles ...

            • Partager sur Facebook
            • Partager sur Twitter

            Comment écraser contenu fichier avec Boost Log ?

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown