[boost] What is the right way to close and clean boost::log

590 views
Skip to first unread message

JH via Boost

unread,
Feb 29, 2020, 6:25:09 AM2/29/20
to boost, JH
Hi,

I built boost::log in my application library, it created
boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>
and close it by calling the
boost::log::core::get()->remove_all_sinks() in destructor of the Log
library, then one of my application link to my log library got
Segmentation fault when it exited:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5fdd961 in boost::log::v2_mt_posix::core::remove_all_sinks() ()
from /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1

If I add boost::log::core::get()->remove_all_sinks() in my application
main before it return 0, the segmentation was gong, but it stuck.

What is the proper right way to close and clean the boost::log? There
is a blog suggested to run boost::log::core::get()->remove_all_sinks()
when the main end, but that does not seem work.

https://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/log/rationale/why_crash_on_term.html

Thank you.

Kind regards,

- jupiter

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Andrey Semashev via Boost

unread,
Feb 29, 2020, 8:09:44 AM2/29/20
to bo...@lists.boost.org, Andrey Semashev
On 2020-02-29 14:24, JH via Boost wrote:
> Hi,
>
> I built boost::log in my application library, it created
> boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>
> and close it by calling the
> boost::log::core::get()->remove_all_sinks() in destructor of the Log
> library, then one of my application link to my log library got
> Segmentation fault when it exited:
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x00007ffff5fdd961 in boost::log::v2_mt_posix::core::remove_all_sinks() ()
> from /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1
>
> If I add boost::log::core::get()->remove_all_sinks() in my application
> main before it return 0, the segmentation was gong, but it stuck.
>
> What is the proper right way to close and clean the boost::log? There
> is a blog suggested to run boost::log::core::get()->remove_all_sinks()
> when the main end, but that does not seem work.
>
> https://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/log/rationale/why_crash_on_term.html

The right way is to call remove_all_sinks at the end of main, and not
use logging after that. E.g. you shouldn't use logging library in global
destructors.

Regarding hanging, you need to investigate what causes the hang.

Andrey Semashev via Boost

unread,
Feb 29, 2020, 8:10:55 AM2/29/20
to bo...@lists.boost.org, Andrey Semashev

Also, if you're keeping shared pointers referring to the sink backends,
you should reset those pointers before returning from main.

JH via Boost

unread,
Mar 1, 2020, 4:25:57 AM3/1/20
to bo...@lists.boost.org, JH
Hi Andrey,

On 3/1/20, Andrey Semashev via Boost <bo...@lists.boost.org> wrote:
>> The right way is to call remove_all_sinks at the end of main, and not
>> use logging after that. E.g. you shouldn't use logging library in global
>> destructors.

That seems working after removing it from the global destructor.

>> Regarding hanging, you need to investigate what causes the hang.

That fixed hanging after removed remove_all_sinks from the library
global destructor, added it to the main of applications.

> Also, if you're keeping shared pointers referring to the sink backends,
> you should reset those pointers before returning from main.

I don't keep shared pointers in applications, it is in the log
library, if the instance of the library exits, the shared pointers
will be automatically cleaned up. Hope that is a right implementation.

Thanks Andrey,

Kind regards,

- jupiter
Reply all
Reply to author
Forward
0 new messages