原文链接:Gecko_Logging
Gecko核心代码提供了一个基础的C++日志记录框架。所有构建 (Debug、Release)默认开启,线程安全,是NSPR日志记录的首选。
日志记录框架
声明日志模块
LazyLogModule以线程安全的方式推迟创建后台LogModule,并且是声明日志模块的首选方法。
#include "mozilla/Logging.h"
static mozilla::LazyLogModule sFooLog("foo");
提供了2个宏和1个枚举类做为基本接口
Mozilla日志记录宏
MOZ_LOG(module, level, message)
输出指定信息,如果模块日志级别允许。
- module - 要使用的日志模块
- level - 消息的日志输出级别
- message - 要输出的printf样式消息。必须括在括号中
MOZ_LOG_TEST(module, level)
检查模块是否开启相应的日志输出级别。
- module - 要使用的日志模块
- level - 日志输出级别
Mozilla日志级别
日志级别 | 数值 | 作用 |
---|---|---|
Disabled | 0 | 表示日志记录已禁用。这不应该直接在代码中使用。 |
Error | 1 | 发生错误,通常你会考虑在调试生成中断言。 |
Warning | 2 | 警告通常表示意外状态。 |
Info | 3 | 通常指示当前程序状态。 |
Debug | 4 | 调试消息,对调试有用,但过于冗长,无法正常打开。 |
Verbose | 5 | 将打印很多有用的调试程序流,并可能会影响性能。 |
日志记录接口
使用示例
示例代码
#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!"));
}
}
开启日志输出
模块的日志级别通过在启动应用程序之前设置环境变量来控制。
export MOZ_LOG="example_logger:3"
有一些特殊的模块名可以改变日志行为。除日志级别以外,你可以指定一个或多个特殊模块名称。
模块名 | |
---|---|
append | 将新日志附加到现有日志文件。 |
sync | 同步打印每个日志,这对于实时检查行为或在崩溃之前获取日志很有用。 |
timestamp | 插入时间戳开始每个日志行。 |
rotate:N | 这限制了生成的日志文件的大小。仅保存最近的N兆字节的日志数据。我们使用.0,.1,.2,.3扩展名旋转四个日志文件。注意:此选项禁用“附加”和强制的时间戳。 |
例如,如果要指定“sync”,“timestamp”和“rotate”:
export MOZ_LOG="example_logger:3,timestamp,sync,rotate:10"
重定向日志到文件
日志输出可以通过环境变量传递其路径来重定向到文件。
默认情况下,日志输出到stderr。
export MOZ_LOG_FILE="log.txt"
上述转储和附加选项仅适用于记录到文件。
E10S注意
当content进程在沙盒中时,它不能写入stderr或任何文件。可能需要将首选项security.sandbox.content.level设置为0才能查看日志。