std::ostringstream flushen nachdem was reingeschrieben wurde



  • Servus,

    ich habe hier eine kleine Logger-Klasse, die ein Singleton implementiert und eine statische Methode hat, um einen std::string loggen zu können. Diesem String wird ein Timestamp vorangesetzt und er wird dann sowohl auf der Konsole als auch in eine Datei ausgegeben.

    Soweit, so gut, nun würde ich aber gerne kompliziertere Ausdrücke loggen können und zwar so komfortabel wie ein std::cout.

    Dazu habe ich einen std::ostringstream definiert.
    Mein Logger hat jetzt eine statische Methode

    static std::ostringstream& logstream() { return getLogger()->m_stringstream;}
    

    Was ich jetzt bräuchte wäre eine möglichkeit, ein schreiben in diesen Stream zu bemerken und danach direkt die Methode log(std::string) aufzurufen.

    Bisher mache ich es so, dass ich einem Aufruf

    Logger::logstream << "Das ist der " << i << ".te Logeintrag";
    

    ein

    Logger::flush()
    

    nachschalte, wobei flush einfach

    getLogger()->log(getLogger->m_stringstream.str());
    

    macht, gefolgt von einer Neuinitialisierung des stringstream mit str("").

    Das ist aber zeimlich unhandlich.
    Die auf der Hand liegende Methode wäre, vor dem return m_stringstream jeweils ein flush() aufzurufen und das letzte flush() im singleton-destruktor.

    Dann stimmen aber meine Timestamps nicht mehr mit dem tatsächlichen Logeintrag überein, was an manchen Stellen entscheidend ist.

    Geht das eleganter?
    Etwa über ein callback, was aufgerufen wird, wenn der stringstream manipuliert wurde?

    Danke für Ideen!
    Phil



  • Du könntest den stringstream kapseln.

    class mysstringstream
    {
        stringstream str;
    
    public:
        op<<(..) { str << ..; flush(); }
    };
    


  • dann muss ich aber für jeden Dreckstyp, den ich unterstützen möchte, den <<-operator neu schreiben.

    Ich merke gerade, flush ist wohl nicht der richtige Name für diese Methode. Es geht NICHT um die iostream methode flush, sondern um das, was ich oben definiert habe:
    getLogger()->log(getLogger->m_stringstream.str());


Anmelden zum Antworten