[翻译] Gecko日志记录

原文链接:Gecko_Logging

Gecko核心代码提供了一个基础的C++日志记录框架。所有构建 (Debug、Release)默认开启,线程安全,是NSPR日志记录的首选。

日志记录框架

声明日志模块

LazyLogModule以线程安全的方式推迟创建后台LogModule,并且是声明日志模块的首选方法。

1
2
3
#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 将打印很多有用的调试程序流,并可能会影响性能。

日志记录接口

使用示例

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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!"));
}
}

开启日志输出

模块的日志级别通过在启动应用程序之前设置环境变量来控制。

1
export MOZ_LOG="example_logger:3"

有一些特殊的模块名可以改变日志行为。除日志级别以外,你可以指定一个或多个特殊模块名称。
|模块名||
|—-|—|
|append|将新日志附加到现有日志文件。|
|sync|同步打印每个日志,这对于实时检查行为或在崩溃之前获取日志很有用。|
|timestamp|插入时间戳开始每个日志行。|
|rotate:N|这限制了生成的日志文件的大小。仅保存最近的N兆字节的日志数据。我们使用.0,.1,.2,.3扩展名旋转四个日志文件。注意:此选项禁用“附加”和强制的时间戳。|


例如,如果要指定“sync”,“timestamp”和“rotate”:

1
export MOZ_LOG="example_logger:3,timestamp,sync,rotate:10"

重定向日志到文件

日志输出可以通过环境变量传递其路径来重定向到文件。

默认情况下,日志输出到stderr。

1
export MOZ_LOG_FILE="log.txt"

上述转储和附加选项仅适用于记录到文件。

E10S注意

当content进程在沙盒中时,它不能写入stderr或任何文件。可能需要将首选项security.sandbox.content.level设置为0才能查看日志。

坚持原创技术分享,您的支持将鼓励我继续创作!