C/C++

Logging In C++

Source Code Accompanies This Article. Download It Now.

Logging is a critical technique for troubleshooting and maintaining software systems. Petru presents a C++ logging framework that is typesafe, thread-safe, and portable.

A Little Trick

So far, the framework has shown good returns on only minor investments: It offers some nice formatting rules (the tabs according with the logging level and final std::endl) in a small, easy-to-use package. However, the current Log has an efficiency problem: If the logging level is set to actually do nothing, Log accumulates the data internallyjust to notice later, during destruction, that no output is required! This single issue is big enough to be a showstopper against Log's use in a production system.

You can use a little trick that makes the code, when logging is not necessary, almost as fast as the code with no logging at all. Logging will have a cost only if it actually produces output; otherwise, the cost is low (and actually immeasurable in most cases). This lets you control the trade-off between fast execution and detailed logging.

Let's move the check from the destructor to the earliest possible time, which is just before the construction of the Log object. In this way, if the logging level says you should discard the logged data, you won't even create the Log object.

Logging is much more efficient now. You can add logging liberally to your code without having serious efficiency concerns. The only thing to remember is to pass higher (that is, more detailed) logging levels to code that's more heavily executed.

After applying this trick, macro-related dangers should be avoidedwe shouldn't forget that the logging code might not be executed at all, subject to the logging level in effect. This is what we actually wanted, and is actually what makes the code efficient. But as always, "macro-itis" can introduce subtle bugs. In this example:

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task.
However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

Video

This month's Dr. Dobb's Journal

This month,
Dr. Dobb's Journal is devoted to mobile programming. We introduce you to Apple's new Swift programming language, discuss the perils of being the third-most-popular mobile platform, revisit SQLite on Android
, and much more!