Logging
-
Hallo.
ich will ein kleines LoggingProgramm schreiben welches im Fehlerfall die Fehlermeldung sowohl in eine Datei als auch auf dem Bildschirm ausgibt.class cErrorLogStream : public cLogStream { public: cErrorLogStream(std::ofstream *fOStream); std::ostream& operator<<(const std::string &fString); protected: std::ofstream * m_stream; };cErrorLogStream::cErrorLogStream(std::ofstream *fOStream) { m_stream = fOStream; } std::ostream& cErrorLogStream::operator<<(const std::string &fString) { std::cout << fString << std::flush; if (!m_stream) { std::cout << "Error: cErrorLogStream --> m_stream==NULL\n" << std::flush; } return *m_stream << fString << std::flush; }std::ofstream* getFileStream(std::string fFileName) { return new std::ofstream(fFileName.c_str(), std::ios_base::app); }#define myErrOut mErrorStream << "*** Error ***" << std::endl << "10:00:39" << " |" << std::setw(30) << __FUNCTION__ << " | " std::ofstream *aStream=nLog::getFileStream("holgers.log"); nLog::cErrorLogStream mErrorStream(aStream); myErrOut << "Holgers Error Test 2\n" << std::flush; delete aStreamIn der Datei "holger.log" erscheint nun der erwartete text
*** Error ***
10:00:39 | main | Holgers Error Test 2aber per std:cout erscheint nur
*** Error ***
=========================================================
1.) wieso kommt es bei std:cout nicht vollständig raus? wird da irgendwie Vererbungstechnisch falsch abgebogen?
-
Copy Paste Fehler
die Klasse cErrorLogStream
erbt nicht von cLogStream !!!!
-
und BTW: Ungarische Notation ist sowas von out...
-
das hier scheint Probleme zu machen:
stream << x << y << z; == (((stream << x)->rückgabe des streams << y)->rückgabe des streams << z);
Such mal in den Beiträgen http://www.c-plusplus.net/forum/viewtopic-var-p-is-1952714.html#1952714 das könnte weiterhelfen.
-
leider ist das nur "anscheinend" mein Problem. Ich will halt nicht pauschal den Cout Stream in die Datei umleiten. Sondern ich will nur manche Sachen die in die Datei gehen auch auf dem Bildschirm per cout sehen.
Ja ich sehe es, mein Quellcode legt die Annahme sehr nahe. Aber ich will auch mal nen cout aufrufen, was nicht in der Datei landet und auch mal umgedreht, was in die Datei schreiben was nicht aufm Bildschirm landet.
-
Mach dir klar, was die Verkettung der einzelnen operator<< bewirkt, und dann schau, was du in deinem operator<< zurückgibst! Dann wunderst du dich nicht mehr, warum nur der erste cout ankommt, der Rest nur ins file wandert
(padreigh hat es ja schon angedeutet)
-
Jup (schon wieder mißverständlich von mir geschrieben)..die Erklärung von meinem Vorgänger ist richtig.
stream << x << y << z; == (((stream << x)->rückgabe des streams << y)->rückgabe des streams << z);
Ich verstehe schon warum ich da Probleme habe.
ich finde nur keine sinnvolle Lösung für das Problem.
ich versuche gerade ein separates ostream-Objekt zu verwalten in der Klasse. Bisher falle ich da aber immer auf die Fresse.
-
du könntest ja mal Versuchen statt eines ostream& einen deiner Streams zurückzugeben ... <prodd> und vielleicht etwas ähnliches mite deinem filestream machen was du mit cout machst ...
-
HeroHolger schrieb:
Ich verstehe schon warum ich da Probleme habe.
ich finde nur keine sinnvolle Lösung für das Problem.
Wenn Du das IO von streams verändern möchtest, dann möchtest Du in der Regel eigene Stream-Buffer implementieren.
Folgendes benutzt keine Streambuffer, aber vielleicht findest Du es trotzdem hilfreich:
robitzki.de/log.h
robitzki.de/log.cppmfg Torsten
-
Ändere mal std::ostream& operator<<(const std::string &fString); zu std::ostream& operator<<(std::ostream& o, const std::string &fString);
std::ostream& cErrorLogStream::operator<<(std::ostream& o, const std::string &fString) { std::cout << fString << std::flush; if (!m_stream) { std::cout << "Error: cErrorLogStream --> m_stream==NULL\n" << std::flush; } *m_stream << fString << std::flush; return o; }
-
@Opi: das geht leider nicht, es darf nur eine Parameter in der Klammer stehen..zumindest laut meinem Compiler.
-
HeroHolger schrieb:
@Opi: das geht leider nicht, es darf nur eine Parameter in der Klammer stehen..zumindest laut meinem Compiler.
Diese Variante soll auch als freie Funktion implementiert werden.
-
Hi.
kannst du mal erklären was du unter einer freien Funktion verstehst?mfg
-
HeroHolger schrieb:
Hi.
kannst du mal erklären was du unter einer freien Funktion verstehst?Das ist eine Funktion, die nicht Member einer Klasse ist.
-
Wie soll ich ne Operator Methode ohne zugehörende Klasse programmieren? Das angeführte Beispiel geht dafür nicht.
Ne operator<< - Methode mit 2 Parametern erscheint grundsätzlich sehr fragwürdig. Das kann doch gar nicht gehen. ob nun außerhalb oder innerhalb einer Klasse definiert.
Sei es wie es sei..ich hab es probiert..der Compiler akzeptiert es nicht. Und ich sehe keinen logischen Sinn in so einer Methode.
-
Warum fragwürdig? Das ist es nämlich nicht. Und natürlich geht es.
Zeig doch einfach mal, was du ausprobiert hast und deine Fehlermeldung...
-
HeroHolger schrieb:
Ne operator<< - Methode mit 2 Parametern erscheint grundsätzlich sehr fragwürdig. Das kann doch gar nicht gehen. ob nun außerhalb oder innerhalb einer Klasse definiert.
Lies doch bitte mal den Artikel zur Überladung von Operatoren im Magazin
http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html
Punkt 3.4 ist für dich besonders interessant.
Dazu vielleicht auch noch
http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/
-
k wußte ich nicht.
Ich hab mir die links mal angeschaut...muss ich mal probieren.
Ich meld mich (vermutlich) morgen nochmal dazu.
-
Hab mir mal angeschaut was ihr meintet, aber das bringt irgendwie nichts.
Es ist doch anscheinend egal, ob ich den Shift-Operator außerhalb oder innerhalb der Klasse programmiere. Am Ende stehe ich immer noch vor dem Problem, dass ich ihn je nach Situation mal splitten muss oder mal einfach nur in die Datei ausgeben will.
mfg
Holger
-
(*sehnsüchtig an WernerSolomon denk*)
Ich glaube, hübsch wird es erst, wenn Du einen eigenen streambuf schreibst, der zwei andere streambufs besitzt und alle Ausgaben auf beide aufsplittet und Du einen ostream draufsetzt.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1403536.html
-
genau das will ich aber nicht, weil diese Sache (std::cout automatisch in die Weiche schieben) programmweit gültig wäre und nicht nur lokal.
Pauschales Streamsplitting ist eben nicht das was ich will.