What is the most efficient thread-safe C++ logger? [closed]

I am working on a performance critical multi-threaded application. I looked at rlog, Ace and Boost logging. I chose rlog because I read it was the fastest (when logging is disabled, it has the least overhead).

The problem I have is it shows the file name, line number etc. even in release mode. If you can tell me how to shut that information off, my problem might be solved. In any case what is the most efficient logger in C++ for my situation?


Unfortunately I am not able down vote at the moment. As far as I can say never ever use crap like Apache log4cxx. It contains serious bugs.

  1. The last release of 0.9 branch is 0.9.7 and still contains memory leaks because every class with virtual members has no virtual dtor.
  2. The newest release 0.10.x lost a lot of functionality from 0.9.x and is not backwards compatible. You are forced to rewrite a lot of your own code.
  3. The whole project seems to be unmaintained. The release of 0.11.xx has been announced for 2 years.

In my opinion you should go with boost.


Pantheios is thought to be the best performing C++ logging library, as well as claiming to be the only one that is 100% type-safe (see this article about a related library explaining why printf()/iostream-based libraries are not type-safe)


I've had success with log4cxx at http://logging.apache.org/log4cxx/index.html. It's a C++ version of the popular Log4j logger, is easy to configure either via a conf file or in the code. The overhead when it is disabled is minimal (method call and integer compare).

The pattern for the output to the log is defined by a conversion pattern that can be as simple as the date/time and a message. It also handles file size limitation, rollover, etc. You can also configure different patterns for various errors and sources.


Here is how you could shut off the extra information that rlog gives (such as filename, line number etc.). When you initialize rlog in your main() function (or whereever), you might do the following:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

The second argument to StdioNode is for flags to control the output. Check the rlog documentation (can be generated with Doxygen) for the whole list of possible flags. The one in the example here makes rlog only color the output according to severity, without any other information added.