I am trying to use a severity channel logger but I hit the problem with BOOST_LOG_SEV not being a const method -- I'm thinking because of both open_record() and push_record()

This will basically force me to make all methods in my classes not const because they want to write out to their loggers. I can't really afford to do that -- so I'm restricted to global loggers at the moment.

In my current implementation, each class has a logger with the class name as the channel (initialized in their constructors), and it issues log messages at any point with BOOST_LOG_SEV(this->logger, level)

I'd love to hear the reason behind the non-constness and if my design is not the intended for Boost::Log.

有帮助吗?

解决方案

The loggers cannot be const because they change thier own state. If the loggers are thread safe and don't change the logical state of your object then they are a perfect example of where you should use the mutable keyword.

Make the loggers mutable class member mutable SomeLoggerType my_logger;. Then you will be able to modify it in const members. This is precisely what mutable was meant for.

As to your comment about mutable being a bad code smell, mutable is an escape hatch for precisely this kind of purpose. Mutable is fine when you are actually not modifying the logical state of your object (and in c++11 internally synchronised). Another perfectly good example of mutable usage is caching.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top