跳到内容

日志记录

设置

每个框架(WebCore、WebKit、WebKitLegacy、WTF)都独立启用自己的日志记录基础设施(尽管基础设施本身是共享的)。如果您想记录一条消息,请 #include 相关的框架的 Logging.h 头文件。然后,您可以使用下面的宏。

请注意,您不能同时 #include 多个框架的 Logging.h 头文件——它们都定义了一个宏 LOG_CHANNEL_PREFIX,这会相互冲突。只 #include 您特定框架的 Logging.h 头文件。

如果您想执行更高级的操作,例如搜索日志通道列表,请 #include 您框架的 LogInitialization.h 头文件。这些头文件在不同框架之间不会冲突,因此您可以这样做:

#include "LogInitialization.h"
#include <WebCore/LogInitialization.h>
#include <WTF/LogInitialization.h>

实际上,WebKit 就是这样做的,以便在 Web 进程启动期间初始化所有框架的日志通道。

记录消息

有一些用于记录消息的相关宏:

  • LOG(): 在调试构建中记录 printf 风格的消息。需要您指定一个日志通道进行输出。
  • LOG_WITH_STREAM(): 在调试构建中记录 iostream 风格的消息。需要您指定一个日志通道进行输出。
  • RELEASE_LOG(): 类似于 LOG(),但在调试和发布构建中都记录日志。需要您指定一个日志通道进行输出。
  • WTFLogAlways(): 主要用于本地调试,无条件输出消息。不需要日志通道进行输出。

以下是 LOG() 的调用示例:

LOG(MediaQueries, "HTMLMediaElement %p selectNextSourceChild evaluating media queries", this);

第一个参数是一个日志通道。它们有两个目的:

  • 可以独立启用/禁用单个通道(因此您可以获得所有 WebGL 日志,而不会收到任何加载日志)
  • 当多个通道启用时,如果您正在查看日志,可以按通道搜索/过滤

以下是 LOG_WITH_STREAM() 的调用示例:

LOG_WITH_STREAM(Scrolling, stream << "ScrollingTree::commitTreeState - removing unvisited node " << nodeID);

该宏设置了一个名为 stream 的局部变量,第二个参数可以将消息定向到该变量。第二个参数是一组语句——而不是像 LOG()RELEASE_LOG() 那样的表达式。因此,您可以执行以下操作:

LOG_WITH_STREAM(TheLogChannel,
    for (const auto& something : stuffToLog)
        stream << " " << something;
);

这些(大多数)使用宏的原因是,当日志记录被禁用时,整个内容可以被编译掉。考虑以下情况:

LOG(TheLogChannel, "The result is %d", someSuperComplicatedCalculation());

如果这些不是宏,无论日志记录是否启用,您都必须为 someSuperComplicatedCalculation() 付出代价。

启用和禁用日志通道

通道在启动时通过将精心制作的字符串传递给 initializeLogChannelsIfNecessary() 来启用/禁用。在 macOS 和 iOS 端口上,此字符串来自 defaults 数据库。在其他 UNIX 系统和 Windows 上,它来自环境变量。

您可以在 initializeLogChannelsIfNecessary() 中阅读此字符串的语法。这是一个示例:

WebGL -Loading

您还可以指定字符串 all 来启用所有日志记录。

在 macOS/iOS 和 Windows 上,每个框架都有自己单独提供的字符串,用于启用其自己的日志通道。在 Linux 上,所有框架共享相同的字符串。

Linux

设置 WEBKIT_DEBUG 环境变量。

WEBKIT_DEBUG=Scrolling Tools/Scripts/run-minibrowser --gtk --debug

macOS

在 macOS 上,例如,您可以使用以下终端命令启用 Language 日志通道:

for identifier in com.apple.WebKit.WebContent.Development com.apple.WebKit.WebContent org.webkit.MiniBrowser com.apple.WebKit.WebKitTestRunner org.webkit.DumpRenderTree -g /Users/$USER/Library/Containers/com.apple.Safari/Data/Library/Preferences/com.apple.Safari.plist; do
    for key in WTFLogging WebCoreLogging WebKitLogging WebKit2Logging; do
        defaults write ${identifier} "${key}" "Language"
    done
done

您可能还需要根据您正在运行的内容,将这些字符串指定给 com.apple.WebKit.WebContent.Development、全局域或 Safari 容器。

您也可以将此键和值作为参数传递:

Tools/Scripts/run-minibrowser --debug -WebCoreLogging Scrolling

Windows

设置 WTFLoggingWebCoreLoggingWebKit2Logging 环境变量。

它在 Windows 上同时输出日志到 stderr 和 OutputDebugString。控制台应用程序(jsc.exe、WebKitTestRunner.exe 等)可以使用 stderr,但 GUI 应用程序(MiniBrowser.exe)不能。附加调试器以查看 OutputDebugString 的消息。使用 ​子进程调试工具 自动附加子进程。

添加新日志通道

只需在您框架的 Logging.h 头文件中添加一行。根据附带的 Logging.cpp 文件的设置方式,您可能需要在其中添加平行的一行。这应该就是您所需要的一切。不同框架中拥有相同名称的日志通道是可接受的——这就是 LOG_CHANNEL_PREFIX 的作用。

JavaScriptCore 和 dataLog

WebKit 有另一个日志记录基础设施 dataLog。JavaScriptCore 主要使用它。要启用 JSC 日志记录,请设置环境变量或向 jsc 提供命令行开关。例如,JSC_logGC=2run-jsc --logGC=2。如果您构建调试版本,请向 run-jsc 脚本提供 --debug 开关。

调用 run-jsc --options 会列出所有选项和可能的值。在 Windows 上,调用 perl Tools/Scripts/run-jsc --optionsWebKitBuild/Release/bin64/jsc.exe --options