介绍
安装
指南
- Engine
- Profile
- Browser
- BrowserView
- 导航
- 内容
- 上下文菜单
- DOM
- JavaScript
- 弹出窗口
- 对话框
- 下载
- Chrome 扩展程序
- 网络
- 缓存
- Cookies
- 代理
- 身份验证
- 权限
- 插件
- 打印
- 密码
- 用户数据配置文件
- 信用卡
- 媒体
- 缩放
- 拼写检查器
- 部署
- Chromium
故障排除
- 日志记录
- 常见异常
- 应用程序不终止
- 视频不播放
- 无法登录 Google 账号
- 用户数据未被储存
- 配色方案
- 启动失败
- Windows 启动缓慢
- 无响应的 .NET 应用程序
- Chromium 进程意外终止
- 意外行为
- Windows 7/8/8.1 停止支持
迁移
日志记录
本指南将介绍如何为库配置日志记录。
许多问题的根本原因可以通过分析 DotNetBrowser 日志消息来检测。
默认情况下,DotNetBrowser 中的日志记录是禁用的。但如果您遇到问题或观察到一些意外行为,我们建议您执行以下操作: 1. 配置 DotNetBrowser,将所有日志信息保存到文件中。 2. 重现问题。 3. 提交工单 收集日志信息以进行进一步调查。
日志记录级别
DotNetBrowser 支持以下日志记录级别: All
> Verbose
> Information
> Warning
> Error
> Critical
> Off
.
Off
级别可用于完全关闭日志记录,All
级别用于启用所有消息的日志记录,包括来自 Chromium 的消息。
您可以使用 LoggerProvider.Instance.Level
属性更改日志记录级别。
有关日志记录级别的更多信息,请参阅 MSDN 说明。
示例:设置日志记录级别
要保存日志记录级别为 Verbose
和更高级别的所有日志消息,请使用 DotNetBrowser 日志记录 API,如以下代码示例所示:
using DotNetBrowser.Logging;
using System.Diagnostics;
// ...
LoggerProvider.Instance.Level = SourceLevels.Verbose;
Imports DotNetBrowser.Logging
Imports System.Diagnostics
' ...
LoggerProvider.Instance.Level = SourceLevels.Verbose
记录到文件
要将所有日志信息打印到文件,请使用 DotNetBrowser Logging API 的 LoggerProvider.Instance.FileLoggingEnabled
属性,如以下代码示例所示:
using DotNetBrowser.Logging;
// ...
LoggerProvider.Instance.FileLoggingEnabled = true;
LoggerProvider.Instance.OutputFile = "C:\\log.txt";
Imports DotNetBrowser.Logging
' ...
LoggerProvider.Instance.FileLoggingEnabled = True
LoggerProvider.Instance.OutputFile = "C:\log.txt"
在上面的示例中,LoggerProvider.Instance.OutputFile
属性的值表示存储日志消息的文件的绝对或相对路径。
重定向 DotNetBrowser 日志记录
DotNetBrowser 使用 TraceSource 进行日志记录。您可以将 DotNetBrowser 的日志重定向到应用程序中使用的其他日志记录器。为此,您需要创建一个继承自 TraceListener 的自定义类,用于实现日志重定向逻辑。然后,将该自定义的跟踪监听器类配置到 TraceListener 中。
以下是针对两种最流行的日志记录框架(Serilog 和 NLog)的 TraceListener
实现示例。
Serilog
namespace Example
{
public class SerilogTraceListener : TraceListener
{
private readonly string initializeData;
private readonly Lazy<ILogger> logger;
public SerilogTraceListener(string initializeData)
{
this.initializeData = initializeData;
logger = new Lazy<ILogger>(() => Log.ForContext("Context", initializeData));
}
public override void Write(string message)
{
logger.Value.Information(message);
}
public override void WriteLine(string message)
{
logger.Value.Information(message);
}
}
}
Namespace Example
Public Class SerilogTraceListener
Inherits TraceListener
Private ReadOnly initializeData As String
Private ReadOnly logger As Lazy(Of ILogger)
Public Sub New(ByVal initializeData As String)
Me.initializeData = initializeData
logger = New Lazy(Of ILogger)(Function()
Return Log.ForContext("Context", initializeData)
End Function)
End Sub
Public Overrides Sub Write(ByVal message As String)
logger.Value.Information(message)
End Sub
Public Overrides Sub WriteLine(ByVal message As String)
logger.Value.Information(message)
End Sub
End Class
End Namespace
NLog
using NLog;
using System.Diagnostics;
// 自定义 TraceListener,将日志重定向到 NLog
public class NLogTraceListener : TraceListener
{
private static readonly Logger logger = LogManager.GetLogger("TraceSource");
public override void Write(string message)
{
logger.Info(message);
}
public override void WriteLine(string message)
{
logger.Info(message);
}
public override void TraceEvent(TraceEventCache eventCache,
string source,
TraceEventType eventType, int id,
string message)
{
var logEvent = new LogEventInfo
{
LoggerName = source,
Message = message,
Level = ToLogLevel(eventType)
};
logger.Log(logEvent);
}
private LogLevel ToLogLevel(TraceEventType type)
{
switch (type)
{
case TraceEventType.Critical:
return LogLevel.Fatal;
case TraceEventType.Error:
return LogLevel.Error;
case TraceEventType.Warning:
return LogLevel.Warn;
case TraceEventType.Information:
return LogLevel.Info;
case TraceEventType.Verbose:
case TraceEventType.Start:
case TraceEventType.Stop:
case TraceEventType.Suspend:
case TraceEventType.Resume:
case TraceEventType.Transfer:
return LogLevel.Debug;
default:
return LogLevel.Info;
}
}
}
Imports System.Diagnostics
Imports NLog
Public Class MyTraceListener
Inherits TraceListener
Private Shared ReadOnly logger As Logger = LogManager.GetLogger("TraceSource")
Public Overrides Sub Write(message As String)
logger.Info(message)
End Sub
Public Overrides Sub WriteLine(message As String)
logger.Info(message)
End Sub
Public Overrides Sub TraceEvent(eventCache As TraceEventCache,
source As String,
eventType As TraceEventType,
id As Integer,
message As String)
Dim logEvent As New LogEventInfo() With {
.LoggerName = source,
.Message = message,
.Level = ToLogLevel(eventType)
}
logger.Log(logEvent)
End Sub
Private Function ToLogLevel(type As TraceEventType) As LogLevel
Select Case type
Case TraceEventType.Critical
Return LogLevel.Fatal
Case TraceEventType.[Error]
Return LogLevel.[Error]
Case TraceEventType.Warning
Return LogLevel.Warn
Case TraceEventType.Information
Return LogLevel.Info
Case TraceEventType.Verbose,
TraceEventType.Start,
TraceEventType.Stop,
TraceEventType.Suspend,
TraceEventType.Resume,
TraceEventType.Transfer
Return LogLevel.Debug
Case Else
Return LogLevel.Info
End Select
End Function
End Class
配置 TraceListener
实现
在 .NET Framework 中,可以通过 App.config
文件为 TraceSource 配置自定义的跟踪监听器类。
Serilog
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.diagnostics>
<trace autoflush="true"/>
<sources>
<source name="Browser" switchValue="All">
<listeners>
<add name="SerilogTraceListener"
type="Example.SerilogTraceListener, ExampleAssembly"
initializeData="DotNetBrowser" />
</listeners>
</source>
<source name="Process" switchValue="All">
<listeners>
<add name="SerilogTraceListener"
type="Example.SerilogTraceListener, ExampleAssembly"
initializeData="DotNetBrowser" />
</listeners>
</source>
<source name="IPC" switchValue="All">
<listeners>
<add name="SerilogTraceListener"
type="Example.SerilogTraceListener, ExampleAssembly"
initializeData="DotNetBrowser" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
NLog
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.diagnostics>
<trace autoflush="true"/>
<sources>
<source name="Browser" switchValue="All">
<listeners>
<add name="NLogTraceListener"
type="Example.NLogTraceListener, ExampleAssembly" />
</listeners>
</source>
<source name="Process" switchValue="All">
<listeners>
<add name="NLogTraceListener"
type="Example.NLogTraceListener, ExampleAssembly" />
</listeners>
</source>
<source name="IPC" switchValue="All">
<listeners>
<add name="NLogTraceListener"
type="Example.NLogTraceListener, ExampleAssembly" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
较新版本的 .NET 不再支持 App.config
。作为替代方案,可以通过编程方式配置跟踪监听器,如下所示:
TraceSource.Initializing += (sender, e) =>
{
string name = e.TraceSource.Name;
if(name == "IPC" || name == "Browser" || name == "Process")
{
// 添加一个自定义 TraceListener,用于将日志重定向到 NLog
e.TraceSource.Listeners.Add(new NLogTraceListener());
}
};
AddHandler TraceSource.Initializing, Sub(sender, e)
Dim name = e.TraceSource.Name
If name = "IPC" OrElse name = "Browser" OrElse name = "Process" Then
' 添加一个自定义 TraceListener,用于将日志重定向到 NLog
e.TraceSource.Listeners.Add(New NLogTraceListener())
End If
End Sub
您可以在以下文档中了解有关配置 TraceSource 的更多信息:如何:创建和初始化跟踪源