<?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[Grundsätzliche Probleme mit boost::log]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab gestern begonnen, boost::log zu verwenden, da deren Features sehr vielversprechend sind und sie genau meine Anforderungen zu erfüllen scheint. Habe dann allerdings den halben Tag damit verbracht, ein eigentlich triviales Beispiel zu implementieren. Nachdem ich's mit Ach und Krach, viel google und trial'n'error einigermaßen hin bekommen hab, fiel mir auf, dass ich Probleme in meinem atexit Callback habe. Wenn ich dort logge, crasht meine Applikation. Kurzes Reindebuggen zeigte, dass manche Objekte (z.B. core) schon freigegeben sind. Wenn ich von dort aus Objekte aufräume, können die in weiterer Folge also auch nicht mehr loggen, was eine große Einschränkung ist. Jetzt steh ich komplett an. Hier ist mein Code (boost.log ist eine static lib, Compiler ist MSVC 2010):</p>
<p>Deklaration einiger globaler pointer... ich hab erst versucht, per BOOST_LOG_DECLARE_GLOBAL_LOGGER_CTOR_ARGS einen globalen Logger zu definieren, nachdem ich aber den Eindruck hatte, dass ich aufgrund von oben genanntem Problem mehr Kontrolle über den Zeitpunkt der Objektfreigabe benötige, habe ich mich vorerst mal für globale shared_ptr entschieden.</p>
<pre><code class="language-cpp">using namespace boost::log::trivial;

#ifdef _DEBUG
boost::shared_ptr&lt;boost::log::sources::severity_logger&lt;severity_level&gt; &gt;	peekLogger( new boost::log::sources::severity_logger&lt;severity_level&gt;( debug ) );
#else
boost::log::sources::severity_logger&lt;severity_level&gt;	peekLogger( warning );
#endif
boost::shared_ptr&lt;boost::log::core&gt; core;

#define LOG( level )	BOOST_LOG_SEV( *peekLogger, level )
</code></pre>
<p>Initialisierungscode:</p>
<pre><code class="language-cpp">static void initLogging()
{
	core = boost::log::core::get();

	core-&gt;add_global_attribute( &quot;TimeStamp&quot;, boost::make_shared&lt;boost::log::attributes::local_clock&gt;() );

	boost::shared_ptr&lt;boost::log::sinks::text_ostream_backend&gt; consoleBackend = boost::make_shared&lt;boost::log::sinks::text_ostream_backend&gt;();
	consoleBackend-&gt;add_stream( boost::shared_ptr&lt;std::ostream&gt;( &amp;std::cout, boost::log::empty_deleter() ) );
	consoleBackend-&gt;auto_flush( true );

	typedef boost::log::sinks::synchronous_sink&lt;boost::log::sinks::text_ostream_backend&gt; ConsoleSink;
	boost::shared_ptr&lt;ConsoleSink&gt; consoleSink( new ConsoleSink( consoleBackend ) );
#ifdef NDEBUG
	consoleSink-&gt;set_filter( boost::log::filters::attr&lt;int&gt;( &quot;Severity&quot; ) &gt;= warning );
#endif
	consoleSink-&gt;locked_backend()-&gt;set_formatter( 
			boost::log::formatters::stream 
				&lt;&lt; &quot;&lt;&quot; &lt;&lt; boost::log::formatters::attr&lt;severity_level&gt;( &quot;Severity&quot; ) &lt;&lt; &quot;&gt; &quot; 
				&lt;&lt; boost::log::formatters::message()
		);

	boost::shared_ptr&lt;boost::log::sinks::text_file_backend&gt; fileBackend = boost::make_shared&lt;boost::log::sinks::text_file_backend&gt;(
			boost::log::keywords::file_name = toLogPath( &quot;renderer_%Y-%m-%d_%H-%M-%S.log&quot; ),
			boost::log::keywords::rotation_size = 50 * 1024 * 1024,
			boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point( 12, 0, 0 )
		);
	// Enable auto-flushing after each log record written
	fileBackend-&gt;auto_flush( true );

	typedef boost::log::sinks::synchronous_sink&lt;boost::log::sinks::text_file_backend&gt; FileSink;
	boost::shared_ptr&lt;FileSink&gt; fileSink( new FileSink( fileBackend ) );
	fileSink-&gt;locked_backend()-&gt;set_formatter( 
			boost::log::formatters::stream 
				&lt;&lt; boost::log::formatters::date_time&lt;boost::posix_time::ptime&gt;( &quot;TimeStamp&quot; ) &lt;&lt; &quot;: &quot;
				&lt;&lt; &quot;&lt;&quot; &lt;&lt; boost::log::formatters::attr&lt;severity_level&gt;( &quot;Severity&quot;, std::nothrow ) &lt;&lt; &quot;&gt; &quot; 
				&lt;&lt; boost::log::formatters::message()
		);
	core-&gt;add_sink( consoleSink );
	core-&gt;add_sink( fileSink );
}
</code></pre>
<p>Und hier crasht dann das Programm:</p>
<pre><code class="language-cpp">void __cdecl onExit()
{
	LOG( trace ) &lt;&lt; &quot;on exit called&quot;; //boom

	cleanup();
}

//...

int main( int argc, char **argv )
{
	atexit( onExit );

	//....
}
</code></pre>
<p>Genau genommen crasht es in Zeile 439 in core.cpp (&quot;if (it-&gt;get()-&gt;try_consume(rec))&quot;), in basic_core&lt; CharT &gt;::push_record. (&quot;Windows has triggered a breakpoint in Renderer_d.exe. This may be due to a corruption of the heap, which indicates blablabla...&quot;)</p>
<p>Hat jemand eine Idee, was ich dagegen machen könnte? Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300872/grundsätzliche-probleme-mit-boost-log</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 15:22:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300872.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Mar 2012 10:49:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Grundsätzliche Probleme mit boost::log on Tue, 13 Mar 2012 10:49:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hab gestern begonnen, boost::log zu verwenden, da deren Features sehr vielversprechend sind und sie genau meine Anforderungen zu erfüllen scheint. Habe dann allerdings den halben Tag damit verbracht, ein eigentlich triviales Beispiel zu implementieren. Nachdem ich's mit Ach und Krach, viel google und trial'n'error einigermaßen hin bekommen hab, fiel mir auf, dass ich Probleme in meinem atexit Callback habe. Wenn ich dort logge, crasht meine Applikation. Kurzes Reindebuggen zeigte, dass manche Objekte (z.B. core) schon freigegeben sind. Wenn ich von dort aus Objekte aufräume, können die in weiterer Folge also auch nicht mehr loggen, was eine große Einschränkung ist. Jetzt steh ich komplett an. Hier ist mein Code (boost.log ist eine static lib, Compiler ist MSVC 2010):</p>
<p>Deklaration einiger globaler pointer... ich hab erst versucht, per BOOST_LOG_DECLARE_GLOBAL_LOGGER_CTOR_ARGS einen globalen Logger zu definieren, nachdem ich aber den Eindruck hatte, dass ich aufgrund von oben genanntem Problem mehr Kontrolle über den Zeitpunkt der Objektfreigabe benötige, habe ich mich vorerst mal für globale shared_ptr entschieden.</p>
<pre><code class="language-cpp">using namespace boost::log::trivial;

#ifdef _DEBUG
boost::shared_ptr&lt;boost::log::sources::severity_logger&lt;severity_level&gt; &gt;	peekLogger( new boost::log::sources::severity_logger&lt;severity_level&gt;( debug ) );
#else
boost::log::sources::severity_logger&lt;severity_level&gt;	peekLogger( warning );
#endif
boost::shared_ptr&lt;boost::log::core&gt; core;

#define LOG( level )	BOOST_LOG_SEV( *peekLogger, level )
</code></pre>
<p>Initialisierungscode:</p>
<pre><code class="language-cpp">static void initLogging()
{
	core = boost::log::core::get();

	core-&gt;add_global_attribute( &quot;TimeStamp&quot;, boost::make_shared&lt;boost::log::attributes::local_clock&gt;() );

	boost::shared_ptr&lt;boost::log::sinks::text_ostream_backend&gt; consoleBackend = boost::make_shared&lt;boost::log::sinks::text_ostream_backend&gt;();
	consoleBackend-&gt;add_stream( boost::shared_ptr&lt;std::ostream&gt;( &amp;std::cout, boost::log::empty_deleter() ) );
	consoleBackend-&gt;auto_flush( true );

	typedef boost::log::sinks::synchronous_sink&lt;boost::log::sinks::text_ostream_backend&gt; ConsoleSink;
	boost::shared_ptr&lt;ConsoleSink&gt; consoleSink( new ConsoleSink( consoleBackend ) );
#ifdef NDEBUG
	consoleSink-&gt;set_filter( boost::log::filters::attr&lt;int&gt;( &quot;Severity&quot; ) &gt;= warning );
#endif
	consoleSink-&gt;locked_backend()-&gt;set_formatter( 
			boost::log::formatters::stream 
				&lt;&lt; &quot;&lt;&quot; &lt;&lt; boost::log::formatters::attr&lt;severity_level&gt;( &quot;Severity&quot; ) &lt;&lt; &quot;&gt; &quot; 
				&lt;&lt; boost::log::formatters::message()
		);

	boost::shared_ptr&lt;boost::log::sinks::text_file_backend&gt; fileBackend = boost::make_shared&lt;boost::log::sinks::text_file_backend&gt;(
			boost::log::keywords::file_name = toLogPath( &quot;renderer_%Y-%m-%d_%H-%M-%S.log&quot; ),
			boost::log::keywords::rotation_size = 50 * 1024 * 1024,
			boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point( 12, 0, 0 )
		);
	// Enable auto-flushing after each log record written
	fileBackend-&gt;auto_flush( true );

	typedef boost::log::sinks::synchronous_sink&lt;boost::log::sinks::text_file_backend&gt; FileSink;
	boost::shared_ptr&lt;FileSink&gt; fileSink( new FileSink( fileBackend ) );
	fileSink-&gt;locked_backend()-&gt;set_formatter( 
			boost::log::formatters::stream 
				&lt;&lt; boost::log::formatters::date_time&lt;boost::posix_time::ptime&gt;( &quot;TimeStamp&quot; ) &lt;&lt; &quot;: &quot;
				&lt;&lt; &quot;&lt;&quot; &lt;&lt; boost::log::formatters::attr&lt;severity_level&gt;( &quot;Severity&quot;, std::nothrow ) &lt;&lt; &quot;&gt; &quot; 
				&lt;&lt; boost::log::formatters::message()
		);
	core-&gt;add_sink( consoleSink );
	core-&gt;add_sink( fileSink );
}
</code></pre>
<p>Und hier crasht dann das Programm:</p>
<pre><code class="language-cpp">void __cdecl onExit()
{
	LOG( trace ) &lt;&lt; &quot;on exit called&quot;; //boom

	cleanup();
}

//...

int main( int argc, char **argv )
{
	atexit( onExit );

	//....
}
</code></pre>
<p>Genau genommen crasht es in Zeile 439 in core.cpp (&quot;if (it-&gt;get()-&gt;try_consume(rec))&quot;), in basic_core&lt; CharT &gt;::push_record. (&quot;Windows has triggered a breakpoint in Renderer_d.exe. This may be due to a corruption of the heap, which indicates blablabla...&quot;)</p>
<p>Hat jemand eine Idee, was ich dagegen machen könnte? Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2191143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2191143</guid><dc:creator><![CDATA[iko79]]></dc:creator><pubDate>Tue, 13 Mar 2012 10:49:29 GMT</pubDate></item></channel></rss>