This article needs a technical review. How you can help.
A minimal C++ logging framework is provided for use in core Gecko code. It is enabled for all builds, thread-safe, and the preferred alternative to NSPR logging.
More in-depth documentation on modules, message formats, and enabling logging can be found on the NSPR logging page.
Logging framework
Declaring a log module
LazyLogModule defers the creation the backing LogModule in a thread-safe manner and is the preferred method to declare a log module. Multiple LazyLogModules with the same name can be declared, all will share the same backing LogModule. This makes it much simpler to share a log module across multiple translation units. LazyLogLodule provides a conversion operator to LogModule* and is suitable for passing into the logging macros detailed below.
#include "mozilla/Logging.h"
static mozilla::LazyLogModule sFooLog("foo");
Logging interface
A basic interface is provided in the form of 2 macros and an enum class.
| MOZ_LOG(module, level, message) |
Outputs the given message if the module has the given log level enabled.
|
| MOZ_LOG_TEST(module, level) |
Checks if the module has the given level enabled.
|
| Log Level | Numeric Value | Purpose |
|---|---|---|
| Disabled | 0 | Indicates logging is disabled. This should not be used directly in code. |
| Error | 1 | An error occurred, generally something you would consider asserting in a debug build. |
| Warning | 2 | A warning often indicates an unexpected state. |
| Info | 3 | An informational message, often indicates the current program state. |
| Debug | 4 | A debug message, useful for debugging but too verbose to be turned on normally. |
| Verbose | 5 | A message that will be printed a lot, useful for debugging program flow and will probably impact performance. |
Example Usage
Code Sample
#include "mozilla/Logging.h"
using mozilla::LogLevel;
static mozilla::LazyLogModule sLogger("example_logger");
static void DoStuff()
{
MOZ_LOG(sLogger, LogLevel::Info, ("Doing stuff."));
int i = 0;
int start = Time::NowMS();
MOZ_LOG(sLogger, LogLevel::Debug, ("Starting loop."));
while (i++ < 10) {
MOZ_LOG(sLogger, LogLevel::Verbose, ("i = %d", i));
}
// Only calculate the elapsed time if the Warning level is enabled.
if (MOZ_LOG_TEST(sLogger, LogLevel::Warning)) {
int elapsed = Time::NowMS() - start;
if (elapsed > 1000) {
MOZ_LOG(sLogger, LogLevel::Warning, ("Loop took %dms!", elapsed));
}
}
if (i != 10) {
MOZ_LOG(sLogger, LogLevel::Error, ("i should be 10!"));
}
}
Enabling Logging
The log level for a module is controlled by setting an environment variable before launching the application.
By default all logging output is disabled.
set MOZ_LOG="example_logger:3"
There are special module names to change logging behavior. You can specify one or more special module names without logging level.
| Special module name | |
|---|---|
| append | Append new logs to existing log file. |
| sync | Print each log synchronously, this is useful to check behavior in real time or get logs immediately before crash. |
| timestamp | Insert timestamp at start of each log line. |
| rotate:N | This limits the produced log files' size. Only most recent N megabytes of log data is saved. We rotate four log files with .0, .1, .2, .3 extensions. Note: this option disables 'append' and forces 'timestamp'. |
For example, if you want to specify "sync", "timestamp" and "rotate":
set MOZ_LOG="example_logger:3,timestamp,sync,rotate:10"
See NSPR log modules reference for further details.
Redirecting logging output to a file
Logging output can be redirected to a file by passing its path via an environment variable.
By default logging output goes to stderr.
set MOZ_LOG_FILE="log.txt"
The rotate and append options described above only apply when logging to a file.