Logging
-
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.
-
Dann willst du temporäres Streamsplitting?
http://www.c-plusplus.net/forum/viewtopic-var-p-is-842769.html#842769@volkard,
Die Forumsuche kann Werner Salomon heraufbeschwören
Grüssli
-
nein, ich will kein temporäres...ich möchte konkretes splitten..also nur wenn ich es brauche
log << "ich schreibe in cout" errlog << "ich schreibe in Datei und cout"; log << "ich schreibe in cout" errlog << "ich schreibe in Datei und cout";Das muss über zig Bibliotheken und u.U. auch threadsicher funktionieren.
-
Dann verwende die von volkard genannte Weiche auf dein
errlogund nicht aufstd::cout. Ist dir übrigens bewusst, dass es einstd::cerrgibt?Grüssli
-
Warum nicht gleich boost::log?
-
Die WS Streamweiche hat er schon in Post 4 angeboten bekommen (und abgelehnt)

-
padreigh schrieb:
Die WS Streamweiche hat er schon in Post 4 angeboten bekommen (und abgelehnt)

aber da (vrmtl) auch nur, weil er dachte, er müsse sie auf std::cout anwenden.
-
das mit std::cerr könnte klappen. Das probiere ich mal die Tage.
ich teste gerade log4cxx (bin bisher aber nicht begeistert)
mfg
-
Ich hab das jetzt mal versucht zu realisieren..aber es klappt noch nciht so ganz.
ich nutzte die aus dem anderen Forum bekannte Weiche als Klasse cWeiche!
class cLogStream { public: cLogStream(std::ofstream *fOStream); std::ostream& operator<<(const std::string &fString); protected: std::ofstream * m_stream; cWeiche m_Weiche; };cLogStream::cLogStream(std::ofstream *fOStream) : m_stream(fOStream), m_Weiche(std::cerr, *fOStream) { }; std::ostream& cLogStream::operator<<(const std::string &fString) { if (!m_stream) { std::cout << "Error: cLogStream --> m_stream==NULL\n" << std::flush; } return *m_stream << fString << std::flush; }jetzt nutze ich die Klasse im Main wie folgt
{ std::ofstream *aStream=nLog::getFileStream("holgers.log"); nLog::cLogStream mStream(aStream); std::cerr << "1\n" ; std::cerr << "2\n" ; std::cerr << "3\n" ; std::cerr << "4\n" ; mStream << "5\n"; mStream << "6\n"; mStream << "7\n"; mStream << "8\n"; mStream << "9\n"; std::cerr << "10\n" << std::flush ; std::cerr << "11\n" << std::flush; }Auf dem bildschirme rscheint nun, wie gewollt
1
2
3
4
10
11aber in der Datei erscheint nur
1
2
3
4
5
6
7
8
9In der Datei fehlen die Ausgaben 10 und 11
Hat jemand eine Idee?
-
wieder mal im testprogramm vergessen den pointer zu löschen.
nach löschen des Pointers geht es..
Ein herzliches Dankeschön an alle, die mir geholfen haben.
-
Gibt es irgendwelche begrenzungen mit der Weiche?
ich hab gearde nen Crash gehabt wo das core-File tausende zeilen hat die irgendwie so aussehen
#949 0xb74a3f3a in std::basic_streambuf<char, std::char_traits<char> >::sputc (this=0x82e167c, __c=42 '*')
at /usr/local/crosstool/crosstool-0.43/build/i686-unknown-linux-gnu/gcc-4.2.1-glibc-2.3.6/build-gcc/i686-unknown-linux-gnu/libstdc++-v3/include/streambuf:430
#950 0xb75ca6de in nLog::cWeiche::overflow (this=0x82bbcb4, c=42) at /users/holger/workspace_rsn/mil/awu/sm/smoswa/smoswa_utils/log_stream.h:95
^C#951 0xb74a3f3a in std::basic_streambuf<char, std::char_traits<char> >::sputc (this=QuitHa<t jemand eine Idee was da schief geht?
-
HeroHolger schrieb:
Gibt es irgendwelche begrenzungen mit der Weiche?
ich hab gearde nen Crash gehabt wo das core-File tausende zeilen hat die irgendwie so aussehen
#949 0xb74a3f3a in std::basic_streambuf<char, std::char_traits<char> >::sputc (this=0x82e167c, __c=42 '*')
at /usr/local/crosstool/crosstool-0.43/build/i686-unknown-linux-gnu/gcc-4.2.1-glibc-2.3.6/build-gcc/i686-unknown-linux-gnu/libstdc++-v3/include/streambuf:430
#950 0xb75ca6de in nLog::cWeiche::overflow (this=0x82bbcb4, c=42) at /users/holger/workspace_rsn/mil/awu/sm/smoswa/smoswa_utils/log_stream.h:95
^C#951 0xb74a3f3a in std::basic_streambuf<char, std::char_traits<char> >::sputc (this=QuitHa<t jemand eine Idee was da schief geht?
ich vermute mal, dass Du den Scope verlassen hast, in dem sich das ofstream-Objekt befindet, auf das Du logging-Ausgabe machen willst. Die beiden ostream-Objekte (z.B.: cout, ofstream) sollten sich im selben Scope wie das Weiche-Objekt oder einem übergeordneten Scope (cout ist global) befinden.
Andere Möglichkeit: Du greifst aus mehreren Threads ungeschützt und gleichzeitig auf das Logging-File zu.
-
k dann kommen wir zur Frage aller Fragen.
1.) ist diese Weiche Thread-sicher?
2.) was passiert wenn in einem anderen Thread oder außerhalb meines Bereiches/Scopes jemand std::cerr nutzt? geht es dann schief? cerr soll doch nur bei mir in der Datei landen.