<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Design eines Loggers]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich habe schon seit einigen Wochen das Problem, dass ich nicht genau weiß wie ich einen Logger in C++ designen soll. Ich habe schon viele Ansätze gesehen und irgendwie hat mich alles eher verwirrt, als dass ich sicherer wurde. Aus älteren Projekten kenne ich sowas wie LOG_INFO() oder LOG_ERROR(). Einfache Makros, die einen std::string als Parameter erwarten. Problem war allerdeings, dass man verschiedene Datentypen vorab manuell zusammenfassen musste.</p>
<p>Beispiel:</p>
<pre><code>// Methode 1:
LOG_INFO(&quot;Das ist eine Meldung&quot;);

// Methode 2:
std::stringstream ss;
ss &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;
LOG_INFO(ss.str());
</code></pre>
<p>Nun, das finde ich irgendwie nicht sehr elegant. Mir schwebt eher so etwas vor:</p>
<pre><code>// Variante A
Log(INFO, &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;);

// Variante B
Log(INFO) &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;

// Variante C
LOG_INFO &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;
</code></pre>
<p>Variante A wäre schonmal interessant, allerdings glaube ich nicht dass man das so umsetzen kann. Variante B ist auch gut und soweit ich weiß umsetzbar. Im letzten Thread (<a href="https://www.c-plusplus.net/forum/337297">https://www.c-plusplus.net/forum/337297</a>) hat mir Finnegan den Tipp gegeben. Soweit ich gelesen habe, muss man den &lt;&lt; Opterator überladen, aber ich habe es noch nicht hinbekommen. Variante C wäre mit Makro und würde noch die Möglichkeit bieten, __FILE__ und __LINE__ zu nutzen.</p>
<p>Was bis jetzt funktionieren würde, wäre folgendes:</p>
<pre><code>class myLogger
{
public:
    myLogger() {}
    ~myLogger() {}

    void logInfo(std::string msg)
    {
        // hier kann ich 'msg' verarbeiten
    }
};

myLogger Log;

int main()
{
    Log.logInfo(&quot;Das ist eine Meldung&quot;);
}
</code></pre>
<p>Diese Variante ist nicht so toll und daher würde ich es wohl eher so machen:</p>
<pre><code>class myLogger
{
public:
    myLogger() {}
    ~myLogger() {}

    myLogger(int logLevel, std::string msg)
    {
    	//hier kann ich 'msg' verarbeiten
    }
};

int main()
{
    myLogger(INFO, &quot;Das ist eine Meldung&quot;);
}
</code></pre>
<p>'INFO' wird mal ein enum sein, mit verschiedenen Log-Leveln (debug, info, warn, error, fatal). Die Klasse ist hier auch nur minimal und wird später statische Variablen haben, in den z.B. festgelegt wird, wo die Logdaten gespeichert werden. Wie müsste ich hier den &lt;&lt; Operator überladen, damit ich eine Funktion wie in Variante B hätte (myLogger(INFO) &lt;&lt; &quot;mein text&quot;; )? Muss ich das global definieren oder in der Klasse? Wahrscheinlich müsste ich auch mit stringstream arbeiten anstatt mit string, oder?</p>
<p>Was mir auch Kopfzerbrechen bereitet, ist die Frage wie stark die Anwendung belastet wird, wenn man viel loggt. ...solle man einen Logger gleich thread-sicher programmieren? ...sollte man Vorkehrungen treffen, damit der Logger nur einmal instanziiert werden kann? (stoße in Foren häufig auf den Begriff 'singleton').</p>
<p>...viele Fragen und maximale Verwirrung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337307/design-eines-loggers</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 04:34:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337307.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Mar 2016 12:29:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design eines Loggers on Wed, 23 Mar 2016 12:29:34 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich habe schon seit einigen Wochen das Problem, dass ich nicht genau weiß wie ich einen Logger in C++ designen soll. Ich habe schon viele Ansätze gesehen und irgendwie hat mich alles eher verwirrt, als dass ich sicherer wurde. Aus älteren Projekten kenne ich sowas wie LOG_INFO() oder LOG_ERROR(). Einfache Makros, die einen std::string als Parameter erwarten. Problem war allerdeings, dass man verschiedene Datentypen vorab manuell zusammenfassen musste.</p>
<p>Beispiel:</p>
<pre><code>// Methode 1:
LOG_INFO(&quot;Das ist eine Meldung&quot;);

// Methode 2:
std::stringstream ss;
ss &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;
LOG_INFO(ss.str());
</code></pre>
<p>Nun, das finde ich irgendwie nicht sehr elegant. Mir schwebt eher so etwas vor:</p>
<pre><code>// Variante A
Log(INFO, &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;);

// Variante B
Log(INFO) &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;

// Variante C
LOG_INFO &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;
</code></pre>
<p>Variante A wäre schonmal interessant, allerdings glaube ich nicht dass man das so umsetzen kann. Variante B ist auch gut und soweit ich weiß umsetzbar. Im letzten Thread (<a href="https://www.c-plusplus.net/forum/337297">https://www.c-plusplus.net/forum/337297</a>) hat mir Finnegan den Tipp gegeben. Soweit ich gelesen habe, muss man den &lt;&lt; Opterator überladen, aber ich habe es noch nicht hinbekommen. Variante C wäre mit Makro und würde noch die Möglichkeit bieten, __FILE__ und __LINE__ zu nutzen.</p>
<p>Was bis jetzt funktionieren würde, wäre folgendes:</p>
<pre><code>class myLogger
{
public:
    myLogger() {}
    ~myLogger() {}

    void logInfo(std::string msg)
    {
        // hier kann ich 'msg' verarbeiten
    }
};

myLogger Log;

int main()
{
    Log.logInfo(&quot;Das ist eine Meldung&quot;);
}
</code></pre>
<p>Diese Variante ist nicht so toll und daher würde ich es wohl eher so machen:</p>
<pre><code>class myLogger
{
public:
    myLogger() {}
    ~myLogger() {}

    myLogger(int logLevel, std::string msg)
    {
    	//hier kann ich 'msg' verarbeiten
    }
};

int main()
{
    myLogger(INFO, &quot;Das ist eine Meldung&quot;);
}
</code></pre>
<p>'INFO' wird mal ein enum sein, mit verschiedenen Log-Leveln (debug, info, warn, error, fatal). Die Klasse ist hier auch nur minimal und wird später statische Variablen haben, in den z.B. festgelegt wird, wo die Logdaten gespeichert werden. Wie müsste ich hier den &lt;&lt; Operator überladen, damit ich eine Funktion wie in Variante B hätte (myLogger(INFO) &lt;&lt; &quot;mein text&quot;; )? Muss ich das global definieren oder in der Klasse? Wahrscheinlich müsste ich auch mit stringstream arbeiten anstatt mit string, oder?</p>
<p>Was mir auch Kopfzerbrechen bereitet, ist die Frage wie stark die Anwendung belastet wird, wenn man viel loggt. ...solle man einen Logger gleich thread-sicher programmieren? ...sollte man Vorkehrungen treffen, damit der Logger nur einmal instanziiert werden kann? (stoße in Foren häufig auf den Begriff 'singleton').</p>
<p>...viele Fragen und maximale Verwirrung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491259</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Wed, 23 Mar 2016 12:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Fri, 25 Mar 2016 16:46:44 GMT]]></title><description><![CDATA[<p>Hi,<br />
die Anforderungen an's Logging sind je nach Applikation schon mal extrem unterschiedlich.</p>
<p>Die Variante A hat den Vorteil, dass die einen Ausdruck übergeben kannst, der im Fall, dass der Log-Level nicht hoch genug ist, erst gar nicht ausgewertet wird.</p>
<p>Vor ca. 100 Jahren hatte ich das hier mal geschrieben: <a href="http://robitzki.de/log.h" rel="nofollow">http://robitzki.de/log.h</a></p>
<p>Damit sind Ausdrücke wie:</p>
<pre><code>LOG_INFO(&quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungültig&quot;);
</code></pre>
<p>möglich. Guck mal, ob Du damit was anfangen kannst oder ein paar Anregungen findest. Den Code darfst Du gerne nutzen (rest wäre in log.cpp und log_test.cpp</p>
<p>mfg Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491461</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Fri, 25 Mar 2016 16:46:44 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Sat, 26 Mar 2016 09:49:03 GMT]]></title><description><![CDATA[<p>cool, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>ich schaue es mir am Montag mal genauer an.</p>
<p>noch frohe Ostern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491500</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Sat, 26 Mar 2016 09:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Sun, 27 Mar 2016 01:36:35 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>// Variante B<br />
Log(INFO) &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;</p>
</blockquote>
<p>Das ist die Variante die ich im Moment verwende. Und auch diese lässt sich als Makro umsetzen.<br />
Mit diversen Kunstgriffen im &quot;Log&quot; Makro kann man es sogar hinbekommen dass der &quot;&lt;&lt; x &lt;&lt; y &lt;&lt; z&quot; Teil nur ausgewertet wird wenn der Logger überhaupt aktiv ist. Das ist günstig wenn man an performancekritischen Stellen logging einbauen möchte, welches im Normalbetrieb allein durch die Auswertung der Argumente für die &lt;&lt; Operatoren schon bremsen würde -- selbst wenn der &lt;&lt; Operator dann sieht dass es nichts zu tun gibt und entsprechend sofort &quot;return&quot; macht.</p>
<p>Und dadurch dass es sich um ein Makro handelt kannst du auch in dieser Variante <code>__FILE__, __FUNCTION__</code> und <code>__LINE__</code> mitgeben.</p>
<p>Wie man das machen kann kannst du dir z.B. bei Boost.Log abgucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491575</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 27 Mar 2016 01:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Sun, 27 Mar 2016 09:11:25 GMT]]></title><description><![CDATA[<p>Kann man Variante B überhaupt threadsafe implementieren? Also das diese Zeile garantiert als Ganzes geloggt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491581</guid><dc:creator><![CDATA[hmmmmmm]]></dc:creator><pubDate>Sun, 27 Mar 2016 09:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Sun, 27 Mar 2016 12:05:11 GMT]]></title><description><![CDATA[<p>Sicherlich.<br />
Du &lt;&lt;st ja nicht nach cout sondern in ein Log-Message Objekt. Das dann zum Schluss als ganzes .submit()ed wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491599</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 27 Mar 2016 12:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Mon, 28 Mar 2016 05:36:49 GMT]]></title><description><![CDATA[<p>Aber wie stellt man den Schluss fest? Also den letzten Aufruf von operator&lt;&lt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491647</guid><dc:creator><![CDATA[hmmmmmm]]></dc:creator><pubDate>Mon, 28 Mar 2016 05:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Mon, 28 Mar 2016 07:22:39 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>SBond schrieb:</p>
<blockquote>
<p>// Variante B<br />
Log(INFO) &lt;&lt; &quot;die Variable X mit den Wert &quot; &lt;&lt; myInt &lt;&lt; &quot; ist ungueltig&quot;;</p>
</blockquote>
<p>Das ist die Variante die ich im Moment verwende.</p>
</blockquote>
<p>dito</p>
<p>hmmmmmm schrieb:</p>
<blockquote>
<p>Aber wie stellt man den Schluss fest? Also den letzten Aufruf von operator&lt;&lt;</p>
</blockquote>
<p>Im Destruktor des Proxys.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491648</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Mar 2016 07:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Mon, 28 Mar 2016 19:32:40 GMT]]></title><description><![CDATA[<p>hmmmmmm schrieb:</p>
<blockquote>
<p>Aber wie stellt man den Schluss fest? Also den letzten Aufruf von operator&lt;&lt;</p>
</blockquote>
<p>mit ner for-Schleife</p>
<pre><code class="language-cpp">#define Log(channel) \
    for (LogMessage message(channel); message.IsActive(); message.Submit()) \
        message.GetStream() // - hier wird dann Zeugs reingeshiftet
</code></pre>
<p><code>message.IsActive()</code> muss dabei <code>true</code> zurückliefern wenn die Message noch nicht submitted wurde und der Log-Channel aktiv ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491707</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Mar 2016 19:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Tue, 29 Mar 2016 14:00:07 GMT]]></title><description><![CDATA[<p>auf jeden Fall vielen Dank für die Antworten. Ihr habt mir sehr geholfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491771</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Tue, 29 Mar 2016 14:00:07 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 03:49:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>hmmmmmm schrieb:</p>
<blockquote>
<p>Aber wie stellt man den Schluss fest? Also den letzten Aufruf von operator&lt;&lt;</p>
</blockquote>
<p>mit ner for-Schleife</p>
<pre><code class="language-cpp">#define Log(channel) \
    for (LogMessage message(channel); message.IsActive(); message.Submit()) \
        message.GetStream() // - hier wird dann Zeugs reingeshiftet
</code></pre>
<p><code>message.IsActive()</code> muss dabei <code>true</code> zurückliefern wenn die Message noch nicht submitted wurde und der Log-Channel aktiv ist.</p>
</blockquote>
<p>Durch was wird die Schleife abgebrochen? Anderer Thread, der den Stream ausliest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491814</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 30 Mar 2016 03:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 07:17:28 GMT]]></title><description><![CDATA[<p>Ich vermute, die Schleife wird entweder genau einmal, oder niemals ausgeführt. Anders ergibt es keinen Sinn. Man hätte auch if schreiben können, dann müsste man aber einen umschließenden Scope haben, damit die Variable message nicht sichtbar ist. Sehr pfiffig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491824</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 30 Mar 2016 07:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 07:26:09 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Durch was wird die Schleife abgebrochen? Anderer Thread, der den Stream ausliest?</p>
</blockquote>
<p>Dadurch dass Submit aufgerufen wird.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p><code>message.IsActive()</code> muss dabei <code>true</code> zurückliefern wenn die Message noch nicht submitted wurde und der Log-Channel aktiv ist.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2491826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491826</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Mar 2016 07:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 19:20:37 GMT]]></title><description><![CDATA[<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Ich vermute, die Schleife wird entweder genau einmal, oder niemals ausgeführt.</p>
</blockquote>
<p>Genau.<br />
0x wenn der Channel inaktiv ist und 1x wenn er aktiv ist.</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Anders ergibt es keinen Sinn.</p>
</blockquote>
<p>Genau.</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Man hätte auch if schreiben können, dann müsste man aber einen umschließenden Scope haben, damit die Variable message nicht sichtbar ist.</p>
</blockquote>
<p>Naja, <code>message</code> ist ja in der for-Lösung auch sichtbar. Daher verwendet man in echt dann auch nicht <code>message</code> als Bezeichner sondern eher sowas wie <code>_message_NX2KLQA7MXHE21YLAW5DSVPQN0</code> . Um die Wahrscheinlichkeit klein zu halten dass der User-Programmer den Bezeichner in seinem Programm verwenden will.<br />
Die for-Schleife verwendet man deswegen, weil man dadurch den Submit Aufruf im &quot;i++&quot; Teil unterbringen kann. Das ginge bei if nicht.</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>Sehr pfiffig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
</blockquote>
<p>Ja. Eiskalt von Boost.Log nachgemacht.<br />
(EDIT: Weil unklar formuliert: Ich hab das natürlich bei Boost.Log abgeguckt - die hatten das vorher <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> /EDIT)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491827</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Mar 2016 19:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 17:43:32 GMT]]></title><description><![CDATA[<p>Nu muss ich meinen Proxy löschen, deine Variante ist hübscher.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491857</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 30 Mar 2016 17:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Design eines Loggers on Wed, 30 Mar 2016 19:42:40 GMT]]></title><description><![CDATA[<p>Naja dafür kannst du ne neue, schönere, bessere Klasse programmieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Aber im Ernst, viel ändert sich dadurch ja nicht.</p>
<p>Der vermutlich grösste Vorteil &quot;meiner&quot; Variante ist mMn. dass man unfertig befüllte Log-Messages erkennen kann. Also wenn beim &quot;reinshiften&quot; eine Exception fliegt. Lässt sich ja schön im Dtor der <code>LogMessage</code> * checken - quasi &quot; <code>if (!submitted) ThereWasAProblem();</code> &quot;.<br />
Dann kann man z.B. ne spezielle Meldung rausloggen - evtl. mit dem unvollständigen Message-Text. Oder das Programm abbrechen. Bzw. vermutlich auf jeden Fall mal <code>assert</code> sagen, weil Exceptions beim Zusammenbasteln ner Log-Ausgabe sind ja normalerweise sehr unerwünscht.</p>
<p>*: Name verbesserungswürdig - macht ja mehr als nur &quot;message sein&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2491877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2491877</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Mar 2016 19:42:40 GMT</pubDate></item></channel></rss>