日志记录¶
设置¶
每个框架(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¶
设置 WTFLogging
、WebCoreLogging
或 WebKit2Logging
环境变量。
它在 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=2
或 run-jsc --logGC=2
。如果您构建调试版本,请向 run-jsc
脚本提供 --debug
开关。
调用 run-jsc --options
会列出所有选项和可能的值。在 Windows 上,调用 perl Tools/Scripts/run-jsc --options
或 WebKitBuild/Release/bin64/jsc.exe --options
。