<?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[cout, clog und cerr umleiten]]></title><description><![CDATA[<p>Aloha und guten Morgen,</p>
<p>vorneweg: Der Titel ist ein wenig unglücklich gewählt. Mein Ziel ist mehr als umleiten, aber modifizieren war mir zu hoch gegriffen.</p>
<p>Aber, meine Situation:<br />
Ich sitz hier vor einem Programm, in dem reichlich Gebrauch von cout, clog und cerr gemacht wurde. Das Problem, dass ich jetzt habe, ist, dass die Ausgaben ein klein wenig zu schnell über die Konsole rattern. Deswegen würde ich die gerne in eine Datei umleiten, damit ich mir die in Ruhe anschauen kann.</p>
<p>Das ist jetzt weniger das Problem, über das Umleiten mittels rdbuf() bin ich mir im Klaren. Das hat nur 2 kleinere Folgeprobleme:</p>
<p>1. Wenn ich cout, clog und cerr auf die gleiche Datei umleite, dann weiß ich nicht mehr, von wo die Ausgabe eigentlich kommt.</p>
<p>2. Wenn ich cout, clog und cerr auf 3 unterschiedliche Dateien umleite, verliere ich chronologische Informationen.</p>
<p>Ich würde am liebsten also Variante 1 nehmen und alle Ausgaben in eine Datei leiten. Wie gesagt, weiß ich, wie das mit rdbuf() zu erreichen wäre. Jetzt hätte ich es aber noch gerne, wenn die Ausgaben noch modifiziert werden. Damit meine ich, dass z.B. ein</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;eine normale Ausgabe&quot; &lt;&lt; std::endl;
std::clog &lt;&lt; &quot;ein Logeintrag&quot; &lt;&lt; std::endl;
std::cerr &lt;&lt; &quot;ein Fehler&quot; &lt;&lt; std::endl;
</code></pre>
<p>in der Datei als</p>
<pre><code>OUTPUT: eine normale Ausgabe
LOG: ein Logeintrag
ERROR: ein Fehler
</code></pre>
<p>geschrieben werden.</p>
<p>Ich hab mich deswegen mal durch die C++ Referenz gegraben und bin auf die Funktion <a href="http://www.cplusplus.com/reference/iostream/ios/tie/" rel="nofollow">tie()</a>der Streams gestoßen. Nur scheint die Funktion nicht das zu machen, was ich erwartet hatte.</p>
<p>Deswegen meine Fragen an euch:<br />
Geh ich das Ganze falsch an?<br />
Gibts doch einen Weg über rdbuf()? (Mir ist keiner eingefallen)<br />
Und ist das überhaupt möglich?</p>
<p>Danke schonmal, hoffentlich sind einige von euch Montagmorgens fitter als ich <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>Gruß<br />
Shelling</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290367/cout-clog-und-cerr-umleiten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 14:37:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290367.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jul 2011 06:21:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 06:21:09 GMT]]></title><description><![CDATA[<p>Aloha und guten Morgen,</p>
<p>vorneweg: Der Titel ist ein wenig unglücklich gewählt. Mein Ziel ist mehr als umleiten, aber modifizieren war mir zu hoch gegriffen.</p>
<p>Aber, meine Situation:<br />
Ich sitz hier vor einem Programm, in dem reichlich Gebrauch von cout, clog und cerr gemacht wurde. Das Problem, dass ich jetzt habe, ist, dass die Ausgaben ein klein wenig zu schnell über die Konsole rattern. Deswegen würde ich die gerne in eine Datei umleiten, damit ich mir die in Ruhe anschauen kann.</p>
<p>Das ist jetzt weniger das Problem, über das Umleiten mittels rdbuf() bin ich mir im Klaren. Das hat nur 2 kleinere Folgeprobleme:</p>
<p>1. Wenn ich cout, clog und cerr auf die gleiche Datei umleite, dann weiß ich nicht mehr, von wo die Ausgabe eigentlich kommt.</p>
<p>2. Wenn ich cout, clog und cerr auf 3 unterschiedliche Dateien umleite, verliere ich chronologische Informationen.</p>
<p>Ich würde am liebsten also Variante 1 nehmen und alle Ausgaben in eine Datei leiten. Wie gesagt, weiß ich, wie das mit rdbuf() zu erreichen wäre. Jetzt hätte ich es aber noch gerne, wenn die Ausgaben noch modifiziert werden. Damit meine ich, dass z.B. ein</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;eine normale Ausgabe&quot; &lt;&lt; std::endl;
std::clog &lt;&lt; &quot;ein Logeintrag&quot; &lt;&lt; std::endl;
std::cerr &lt;&lt; &quot;ein Fehler&quot; &lt;&lt; std::endl;
</code></pre>
<p>in der Datei als</p>
<pre><code>OUTPUT: eine normale Ausgabe
LOG: ein Logeintrag
ERROR: ein Fehler
</code></pre>
<p>geschrieben werden.</p>
<p>Ich hab mich deswegen mal durch die C++ Referenz gegraben und bin auf die Funktion <a href="http://www.cplusplus.com/reference/iostream/ios/tie/" rel="nofollow">tie()</a>der Streams gestoßen. Nur scheint die Funktion nicht das zu machen, was ich erwartet hatte.</p>
<p>Deswegen meine Fragen an euch:<br />
Geh ich das Ganze falsch an?<br />
Gibts doch einen Weg über rdbuf()? (Mir ist keiner eingefallen)<br />
Und ist das überhaupt möglich?</p>
<p>Danke schonmal, hoffentlich sind einige von euch Montagmorgens fitter als ich <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>Gruß<br />
Shelling</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097440</guid><dc:creator><![CDATA[-Shelling-]]></dc:creator><pubDate>Mon, 25 Jul 2011 06:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 07:38:53 GMT]]></title><description><![CDATA[<p>Und wenn Du mit mkfifo drei named pipes machst, ein Lausch-Programm startest, das an allen drei Pipes lauscht und jede reinkommende Zeile in die Log-Datei schreibt mit Zeitstempel und Herkunftspipe, und dann das zu untersuchende Programm mit in die named Pipes umgeleiteten Ausgaben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097456</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Jul 2011 07:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 10:50:05 GMT]]></title><description><![CDATA[<p>Das wäre wohl eine Möglichkeit, allerdings wollte ich eigentlich Plattformunabhängig bleiben (zumindest sieht es so aus, als wäre mkfifo unter Windows nicht ohne weiteres vorhanden) und nicht extra ein zweites Programm starten.</p>
<p>Ich hatte gehofft, es gäbe dafür eine Möglichkeit, eine eigene stream Klasse zu erstellen und den operator&lt;&lt; zu überschreiben. Hat leider nicht das gewünschte Ergebnis gebracht.</p>
<p>Was mir noch eingefallen ist, was ich allerdings auch ein wenig &quot;dreckig&quot; finde:<br />
Ich erstell mir 3 Klassen, cout_buf, clog_buf und cerr_buf, alle 3 abgeleitet von std::streambuf und kapsel darin einen filebuf auf meine Logdatei. Wenn ich dann noch die virtuelle Funktion &quot;xsputc()&quot; in meinen 3 Klassen überschreibe, sollte ich theoretisch das gewünschte Ergebnis bekommen.<br />
Bevor ich das angehe, spricht irgendwas gegen diese Idee? (Klingt fast so ähnlich wie die von volkard, nur programminterner)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097542</guid><dc:creator><![CDATA[-Shelling-]]></dc:creator><pubDate>Mon, 25 Jul 2011 10:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 11:07:32 GMT]]></title><description><![CDATA[<p>Darf es quick&amp;dirty sein?</p>
<pre><code class="language-cpp">#define cout log_out &lt;&lt; &quot;COUT &quot; &lt;&lt; timestamp() &lt;&lt; &quot;: &quot;
</code></pre>
<p>Ansonsten: Es sollte eigentlich schon möglich sein, deine eigenen Streambuffer mit timestamp und Umleitung zu schreiben und diese an cout, cerr und clog zu binden. Ist aber sicherlich ein ganz schöner Aufwand, im Gegensatz zu der Variante oben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097550</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Jul 2011 11:07:32 GMT</pubDate></item><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 11:39:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Es sollte eigentlich schon möglich sein, deine eigenen Streambuffer mit timestamp und Umleitung zu schreiben und diese an cout, cerr und clog zu binden. Ist aber sicherlich ein ganz schöner Aufwand, im Gegensatz zu der Variante oben.</p>
</blockquote>
<p>es gibt schon was ähnliches hier im Forum - mit ein paar Änderungen könntest Du <a href="http://www.c-plusplus.net/forum/p1952714#1952714" rel="nofollow">diesen Code</a> nutzen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2097559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097559</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 25 Jul 2011 11:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to cout, clog und cerr umleiten on Mon, 25 Jul 2011 11:47:30 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Es sollte eigentlich schon möglich sein, deine eigenen Streambuffer mit timestamp und Umleitung zu schreiben und diese an cout, cerr und clog zu binden. Ist aber sicherlich ein ganz schöner Aufwand, im Gegensatz zu der Variante oben.</p>
</blockquote>
<p>es gibt schon was ähnliches hier im Forum - mit ein paar Änderungen könntest Du <a href="http://www.c-plusplus.net/forum/p1952714#1952714" rel="nofollow">diesen Code</a> nutzen.</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<p>Ach, jetzt hatte ich gerade ein eigenes Beispiel entwickelt. Eigentlich gar nicht so schwer (mit den richtigen Hilfsmitteln <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="😉"
    /> ) und eine nette Übung:</p>
<pre><code class="language-cpp">#include &lt;boost/iostreams/device/file.hpp&gt;
#include &lt;boost/iostreams/filtering_stream.hpp&gt;
#include &lt;boost/iostreams/filter/line.hpp&gt;

#include &lt;string&gt;
#include &lt;ctime&gt;

namespace io = boost::iostreams;

class prefix_and_timestamp : public io::line_filter 
{
public:
  explicit prefix_and_timestamp(const std::string&amp; prefix): prefix(prefix) {}
private:
  std::string prefix;
  virtual string_type do_filter(const string_type&amp; line)
  {
    std::time_t rawtime;
    std::time ( &amp;rawtime );
    struct tm * timeinfo = localtime(&amp;rawtime);
    char timestamp [80];
    strftime (timestamp,80,&quot;%x %X&quot;,timeinfo);

    return prefix + timestamp + std::string(&quot;: &quot;) + line;
  }
};

int main()
{   
    io::filtering_ostream cout;
    cout.push(prefix_and_timestamp(&quot;COUT &quot;));
    cout.push(io::file_sink(&quot;my_log_file.txt&quot;));

    cout &lt;&lt; &quot;Hello World\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2097566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2097566</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Jul 2011 11:47:30 GMT</pubDate></item></channel></rss>