List icon 目录

日志记录

本指南将介绍如何为库配置日志记录。

许多问题的根本原因可以通过分析 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 的更多信息:如何:创建和初始化跟踪源

Go Top