Поделиться через


Пошаговое руководство. Создание файла журнала

Обновлен: Ноябрь 2007

Можно создать файл журнала, содержащий диагностическую информацию о взаимодействии, загрузке программ и работе с сетью. Разрешить ведение журналов можно путем установки параметров ключей реестра. Сначала установите ключ реестра, позволяющий вести общие записи, и затем установите ключи реестра для желаемых компонентов ведения журнала и опций.

Можно использовать следующие методы для установки ключей реестра:

  • Используйте удаленный редактор реестра в Visual Studio.

  • В пакете обновления 1 (SP1) .NET Compact Framework 2.0 используйте опцию ведения журнала в удаленном мониторе производительности. Дополнительные сведения об удаленном мониторе производительности см. в разделе Практическое руководство. Отслеживание производительности во время выполнения.

  • В .NET Compact Framework 3.5 можно использовать инструмент для ведения журнала NetCFLogging.exe, который предоставляет простой графический пользовательский интерфейс для включения и выключения ведения журнала. Этот инструмент включен в Power Toys для .NET Compact Framework. Дополнительные сведения см. в разделе Power Toys for .NET Compact Framework.

  • Используйте классы Registry и RegistryKey, которые поддерживаются в платформе .NET Compact Framework, версия 2.0 и более поздних версиях.

Файлы журналов обобщаются в следующей таблице.

Компонент журналирования

Содержимое файлов журнала

Взаимодействие

Журналы вызовов COM-взаимодействия. Предоставляет сведения о платформенных вызовах и маршалинге.

Ошибка

Журналы необработанных и машинных исключений Ошибки записываются в файл журнала и в OutputDebugString. Файл журнала создается для каждой сборки текущего пути и используется для текущей сессии. После первого возникновения необработанного или машинного исключения, файл журнала перезаписывается.

Загрузчик

Журнальная информация о загрузке программ. Заголовок файла содержит следующие данные:

  • Имя приложения.

  • Идентификатор процесса (предоставляемый Windows Embedded CE).

  • Локальные дата и время создания файла журнала. Формат не является глобальным или регионально-зависимым.

  • Версия .NET Compact Framework, например, 2.0.5021.00

  • Информация, связанная с платформой, например, Windows Embedded CE v5.0.1400 (CEPC) WinCE5x86 debug Dev i386 IJITv2.

Файл содержит следующие сведения.

  • Состояние поведения (Режим совместимости)

  • Уровень доверия присваивается модулям как только они загружены.

  • Ошибка при разрешении метода.

  • Ошибка при разрешении типа.

  • Ошибка при поиске или загрузке сборки или модуля.

  • Успешная загрузка сборки.

  • Недопустимая версия метаданных.

  • Ошибка при поиске платформенного вызова DLL.

  • Ошибка при поиске функции внутри платформенного вызова DLL.

  • Имя файла политики или факт их отсутствия.

  • Серьезные ошибки в обработке файла политики.

  • Основанное на политике перенаправление управляемых сборок.

Можно включить информацию о глобальном кэше сборок.

Сетевое взаимодействие

Хранит данные о сетевом трафике. Файл журнала сети двоичный, и его нельзя просмотреть без средства просмотра журналов .NET Compact Framework, Logviewer.exe. В платформе .NET Compact Framework 3.5 и более поздних версий средство просмотра журналов включено в Power Toys для .NET Compact Framework. Дополнительные сведения см. в разделе Power Toys для .NET Compact Framework (на английском языке).

Ведение сетевого журнала производится на уровне Windows Sockets, поэтому файл журнала содержит только информацию о сетевых пакетах. Журнал содержит данные, посланные в сеть, которые могут быть и конфиденциальными, если они не зашифрованы.

Завершение

Журналы имен классов объектов, не удаленных перед тем, как они были отброшены при сборке мусора. Этот журнал поддерживается в .NET Compact Framework 3.5 и более поздних версиях.

Имена объектов не включены в журнал, так как их имена не доступны в среде CLR. Но имена классов неуничтоженных объектов могут помочь идентифицировать эти объекты. Неуничтоженные объекты могут создавать проблемы производительности в приложениях.

ms229650.alert_note(ru-ru,VS.90).gifПримечание.
В некоторых случаях .NET Compact Framework вместо кода приложения вызывает метод завершения.

Этот файл содержит следующие сведения.

  • Временная метка, показывающая точное время запуска метода завершения сборщиком мусора объекта.

  • Класс объекта, который был завершен.

Трассировка

Журнал исключений кода для Windows Communication Foundation (WCF) На персональном компьютере .NET Framework поддерживает три типа ведения журнала: трассировка, передача сообщений и журнал событий. WCF .NET Compact Framework поддерживает только журнал трассировки для записи исключений кода, но он не записывает предупреждающие сообщения и сообщения об ошибках.

Этот журнал поддерживается в .NET Compact Framework 3.5 и более поздних версиях.

По умолчанию файл журнала пишется в папку, содержащую диагностируемое приложение. Но можно указать другой путь и другие опции при помощи ключей реестра, как, например, это сделано здесь:

  • Использует альтернативный путь для записи файлов журнала. Для получения доступа к реестру безопасности требуется привилегированный доступ.

  • Включает имя приложения в имя файла журнала.

  • Включает идентификатор процесса в имя файла журнала.

Файл журнала состоит из следующих частей, где компонентом может быть "Взаимодействие", "Ошибка", "Загрузчик", "Сеть", "Метод завершения", или "Трассировка":

netcf_application-name_компонент_processID.log

Имя приложения и идентификатор процесса необязательны и зависят от параметров в реестре.

Например, файл журнала загрузчика для приложения с именем MyApp.exe может иметь следующее имя:

netcf_MyApp_Loader_2066923010.log

Сведения о том, как просмотреть файлы журнала, такие как файл журнала взаимодействия или загрузчика, содержатся в разделе Сведения файла журнала.

Для включения записи в журнал

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Enabled

    Значение этого ключа следует установить для разрешения ведения журналов шести типов: взаимодействия, загрузчика, ошибок, сети, метода завершения и трассировки. Обратите внимание, что подразделы ключа Logging по умолчанию не существуют.

    Чтобы прекратить ведение журнала, установите это значение равным 0 (нуль).

Чтобы указать путь к файлу журнала (необязательно)

  • Установите следующее значение ключа пути равным строке, которая представляет расположение файлов журнала:

    HKLM\Security\.NETCompactFramework\Diagnostics\Logging\Path

    К этому ключу могут иметь доступ только приложения, которые могут писать в реестр безопасности. Если путь не указан, файл журнала пишется в папку, содержащую приложение.

Чтобы включить имя приложения в имя файла журнала (необязательно).

  • Установите значение ключа UseApp равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\UseApp

    Этот ключ полезен, если Вы хотите запустить несколько приложений и получить отдельные файлы журналов для каждого приложения. Если два приложения пишут файл журнала в одну и ту же папку, более старый файл всегда будет переписан более новым при повторном запуске приложения. Ключ UseApp может быть использован как различитель для файлов журнала.

Чтобы включить идентификатор процесса в имя файла журнала (необязательно).

  • Установите значение ключа UsePid равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\UsePid

    Этот ключ полезен, если Вы хотите запустить одно приложение несколько раз и создать отдельные файлы журналов для каждого экземпляра. Этот параметр добавляет идентификатор процесса в имя файла журнала, так что экземпляр приложения создает новый файл журнала с другим именем.

Запись возникающих событий (необязательно)

  • Установите значение ключа Flush равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Flush

    Это значение использует среду CLR, чтобы записать события журнала в файл журнала как только они возникнут вместо того, чтобы сохранять их в буфере и затем записывать после заполнения буфера. Этот параметр негативно влияет на производительность приложения и может замедлять время выполнения приложения. Но он может быть полезен для диагностики проблем, связанных с ошибками приложений или другими ошибками, которые могут показать самое последнее событие, приведшее в результате к ошибке. Если этот ключ не существует или не установлен, данные не записываются в файл журнала, пока буфер не наполнится.

Журнал взаимодействия

Для включения записи в журнал взаимодействия

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Interop\Enabled

Журнал ошибок

Для включения записи в журнал ошибок

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Error\Enabled

Журнал загрузчика

Для включения записи в журнал загрузчика

  • Установите следующее значение Enabled value равным 1, чтобы разрешить ведение журнала для загрузчика, или установите его равным 2, чтобы разрешить ведение журнала для загрузчика и глобального кэша сборок:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Loader\Enabled

Журнал сетевой активности

Для включения записи в журнал сетевой активности

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Networking\Enabled

    Файл журнала сети бинарный и не может быть прочитан без обозревателя журнала .NET Compact Framework, Logviewer.exe, который переводит журнал из бинарного формата в удобный для чтения. В версиях .NET Compact Framework 3.5 и более поздних, обозреватель журнала включен в Power Toys для .NET Compact Framework. Можно загрузить этот инструмент с Загрузочной страница .NET Compact Framework.

Журнал метода завершения

Для включения записи в журнал метода завершения

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Finalizer\Enabled

Журнал трассировки

Для включения записи в журнал трассировки WCF

  • Установите значение следующего ключа Enabled равным 1:

    HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\WCF\Enabled

Пример

Можно установить значения ключей регистра при помощи удаленного редактора регистра или можно написать приложение, которое будет устанавливать значения. Следующий пример в этом разделе содержит следующие методы для обработки необходимых задач реестра.

  • Метод EnableLogging позволяет общее ведение журнала и содержит параметры для указания альтернативного пути для файла журнала, для указания, следует ли добавлять имя приложения и идентификатор процесса в имя файла журнала, и также для указания, какие события нужно будет записать, если они возникнут.

  • Методы SetInteropLogging, SetLoaderLogging и SetNetworkLogging устанавливают соответствие между значением ключа Enabled равным 1, и таким образом разрешающим ведение журнала для каждого компонента.

  • Метод DisableLogging запрещает ведение всех журналов.

  • Метод WriteLoggingSettings рекурсивно проверяет подразделы ключа Logging и записывает их имена и значения в файл журнала. Файл журнала называется logsettings.txt и находится в папке, содержащей пример приложения.

' This method enables general logging. It contains parameters
' to specify a path, and Boolean values of true to include
' the application name, process ID, and events in the log.
Private Sub EnableLogging(ByVal useApp As Boolean, ByVal usePid As Boolean, ByVal useFlush As Boolean) 
    ' Specify values for setting the registry.
    Dim userRoot As String = "HKEY_LOCAL_MACHINE"
    Dim subkey As String = "SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging"
    Dim keyName As String = userRoot + "\" + subkey

    ' Set the Enabled registry value.
    Registry.SetValue(keyName, "Enabled", 1)

    If useApp = True Then
        Registry.SetValue(keyName, "UseApp", 1)
    Else
        Registry.SetValue(keyName, "UseApp", 0)
    End If 
    If usePid = True Then
        Registry.SetValue(keyName, "UsePid", 1)
    Else
        Registry.SetValue(keyName, "UsePid", 0)
    End If 
    If useFlush = True Then
        Registry.SetValue(keyName, "UseFlush", 1)
    Else
        Registry.SetValue(keyName, "UseFlush", 0)
    End If

End Sub

' This method sets the Enabled key value to 1
' so that logging for Interoperability is enabled.
Private Sub SetInteropLogging(ByVal logOn As Boolean) 
    ' Specify values for setting the registry.
    Dim userRoot As String = "HKEY_LOCAL_MACHINE"
    Dim subkey As String = "Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Interop"
    Dim keyName As String = userRoot + "\" + subkey

    Dim logSet As Integer
    If logOn = True Then
        logSet = 1
    Else
        logSet = 0
    End If 
    ' Set the registry value.
    Try
        Registry.SetValue(keyName, "Enabled", logSet)
        If logOn = True Then
            MessageBox.Show("Interop Logging On")
        Else
            MessageBox.Show("Interop Logging Off")
        End If
    Catch ex As System.Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub


' This method sets the Enabled key value to 1
' so that logging for class loading is enabled.
Private Sub SetLoaderLogging(ByVal logOn As Boolean) 
    ' Specify values for setting the registry.
    Dim userRoot As String = "HKEY_LOCAL_MACHINE"
    Dim subkey As String = "Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Loader"
    Dim keyName As String = userRoot + "\" + subkey

    Dim logSet As Integer
    If logOn = True Then
        logSet = 1
    Else
        logSet = 0
    End If 
    ' Set the registry value.
    Try
        Registry.SetValue(keyName, "Enabled", logSet)
        If logOn = True Then
            MessageBox.Show("Loader Logging On")
        Else
            MessageBox.Show("Loader Loggin Off")
        End If
    Catch ex As System.Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub


' This method sets the Enabled key value to 1,
' so that logging for networking is enabled.
Private Sub SetNetworkLogging(ByVal logOn As Boolean) 
    ' Specify values for setting the registry.
    Dim userRoot As String = "HKEY_LOCAL_MACHINE"
    Dim subkey As String = "Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Networking"
    Dim keyName As String = userRoot + "\" + subkey

    Dim logSet As Integer
    If logOn = True Then
        logSet = 1
    Else
        logSet = 0
    End If 
    ' Set the registry value.
    Try
        Registry.SetValue(keyName, "Enabled", logSet)
        If logOn = True Then
            MessageBox.Show("Networking Logging On")
        Else
            MessageBox.Show("Networking Logging Off")
        End If
    Catch ex As System.Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub


' This method disables all logging.
Private Sub DisableLogging() 
    ' Specify values for setting the registry.
    Dim userRoot As String = "HKEY_LOCAL_MACHINE"
    Dim subkey As String = "SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging"
    Dim keyName As String = userRoot + "\" + subkey

    ' Set the Enabled registry value.
    Registry.SetValue(keyName, "Enabled", 0)
    MessageBox.Show("Logging Disabled")

End Sub


' This method recursively examines the keys
' under the Logging subkey and writes their
' key names and values to a log file. It saves
' the information in "logsettings.txt", located
' in the directory that contains this example
' application.
Private Sub WriteLoggingSettings() 
    Dim sw As New StreamWriter("logsettings.txt", False)
    sw.WriteLine("General Logging Settings:")
    Dim rkLogging As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging")
    Dim valNames As String() = rkLogging.GetValueNames()
    Dim x As Integer
    For x = 0 To valNames.Length
        sw.WriteLine(valNames(x).ToString() + ": " + rkLogging.GetValue(valNames(x)).ToString())
    Next x

    sw.WriteLine()
    sw.WriteLine("Interop Logging:")
    Dim rkInterop As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging\Interop")
    Dim interopNames As String() = rkInterop.GetValueNames()

    For x = 0 To interopNames.Length
        sw.WriteLine(interopNames(x).ToString() + ": " + rkInterop.GetValue(interopNames(x)).ToString())
    Next x

    sw.WriteLine()
    sw.WriteLine("Loader Logging:")
    Dim rkLoader As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging\Loader")
    Dim loaderNames As String() = rkLoader.GetValueNames()
    For x = 0 To loaderNames.Length
        sw.WriteLine(loaderNames(x).ToString() + ": " + rkLoader.GetValue(loaderNames(x)).ToString())
    Next x

    sw.WriteLine()
    sw.WriteLine("Networking Logging:")
    Dim rkNetworking As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\.NETCompactFramework\Diagnostics\Logging\Networking")
    Dim netNames As String() = rkNetworking.GetValueNames()
    For x = 0 To netNames.Length
        sw.WriteLine(netNames(x).ToString() + ": " + rkNetworking.GetValue(netNames(x)).ToString())
    Next x
    sw.Close()
End Sub
// This method enables general logging. It contains parameters
// to specify a path, and Boolean values of true to include
// the application name, process ID, and events in the log.
private void EnableLogging(bool useApp, bool usePid, bool useFlush)
{
    // Specify values for setting the registry.
    string userRoot = "HKEY_LOCAL_MACHINE";
    string subkey = "SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging";
    string keyName = userRoot + "\\" + subkey;

    // Set the Enabled registry value.
    Registry.SetValue(keyName, "Enabled", 1);

    if (useApp == true)
        Registry.SetValue(keyName, "UseApp", 1);
    else
        Registry.SetValue(keyName, "UseApp", 0);

    if (usePid == true)
        Registry.SetValue(keyName, "UsePid", 1);
    else
        Registry.SetValue(keyName, "UsePid", 0);

    if (useFlush == true)
        Registry.SetValue(keyName, "UseFlush", 1);
    else
        Registry.SetValue(keyName, "UseFlush", 0);
}

// This method sets the Enabled key value to 1
// so that logging for Interoperability is enabled.
private void SetInteropLogging(bool logOn)
{
    // Specify values for setting the registry.
    string userRoot = "HKEY_LOCAL_MACHINE";
    string subkey = "Software\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Interop";
    string keyName = userRoot + "\\" + subkey;

    int logSet;
    if(logOn == true)
      logSet = 1;
    else
      logSet = 0;

    // Set the registry value.
    try
    {
     Registry.SetValue(keyName, "Enabled", logSet);
     if(logOn == true)
        MessageBox.Show("Interop Logging On");
     else
        MessageBox.Show("Interop Logging Off");
     }
     catch(System.Exception ex)
     {
        MessageBox.Show(ex.Message);
     }
}

// This method sets the Enabled key value to 1
// so that logging for class loading is enabled.
private void SetLoaderLogging(bool logOn)
{
    // Specify values for setting the registry.
    string userRoot = "HKEY_LOCAL_MACHINE";
    string subkey = "Software\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Loader";
    string keyName = userRoot + "\\" + subkey;

    int logSet;
    if(logOn == true)
    logSet = 1;
    else
    logSet = 0;

    // Set the registry value.
    try
    {
        Registry.SetValue(keyName, "Enabled", logSet);
        if(logOn == true)
        MessageBox.Show("Loader Logging On");
        else
        MessageBox.Show("Loader Logging Off");
    }
    catch(System.Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

  // This method sets the Enabled key value to 1
  // so that logging for networking is enabled.
  private void SetNetworkLogging(bool logOn)
  {
    // Specify values for setting the registry.
    string userRoot = "HKEY_LOCAL_MACHINE";
    string subkey = "Software\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Networking";
    string keyName = userRoot + "\\" + subkey;

    int logSet;
    if(logOn == true)
      logSet = 1;
    else
      logSet = 0;

    // Set the registry value.
    try
    {
         Registry.SetValue(keyName, "Enabled", logSet);
         if(logOn == true)
            MessageBox.Show("Networking Logging On");
         else
            MessageBox.Show("Networking Loggin Off");
     }
     catch(System.Exception ex)
     {
        MessageBox.Show(ex.Message);
     }
  }

// This method disables all logging.
private void DisableLogging()
{
    // Specify values for setting the registry.
    string userRoot = "HKEY_LOCAL_MACHINE";
    string subkey = "SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging";
    string keyName = userRoot + "\\" + subkey;

    // Set the Enabled registry value.
    Registry.SetValue(keyName, "Enabled", 0);
    MessageBox.Show("Logging Disabled");
}

// This method recursively examines the keys
// under the Logging subkey and writes their
// key names and values to a log file. It saves
// the information in "logsettings.txt" located
// in the directory that contains this 
// example application.
private void WriteLoggingSettings()
{
    StreamWriter sw = new StreamWriter("logsettings.txt",false);
    sw.WriteLine("General Logging Settings:");
    RegistryKey rkLogging = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging");
    string[] valNames = rkLogging.GetValueNames();
    for (int x = 0; x < valNames.Length; x++)
    {
        sw.WriteLine(valNames[x].ToString() + ": " + rkLogging.GetValue(valNames[x]).ToString());
    }

    sw.WriteLine();
    sw.WriteLine("Interop Logging:");
    RegistryKey rkInterop = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Interop");
    string[] interopNames = rkInterop.GetValueNames();
    for (int x = 0; x < interopNames.Length; x++)
    {
        sw.WriteLine(interopNames[x].ToString() + ": " + rkInterop.GetValue(interopNames[x]).ToString());
    }

    sw.WriteLine();
    sw.WriteLine("Loader Logging:");
    RegistryKey rkLoader = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Loader");
    string[] loaderNames = rkLoader.GetValueNames();
    for (int x = 0; x < loaderNames.Length; x++)
    {
        sw.WriteLine(loaderNames[x].ToString() + ": " + rkLoader.GetValue(loaderNames[x]).ToString());
    }

    sw.WriteLine();
    sw.WriteLine("Networking Logging:");
    RegistryKey rkNetworking = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\.NETCompactFramework\\Diagnostics\\Logging\\Networking");
    string[] netNames = rkNetworking.GetValueNames();
    for (int x = 0; x < netNames.Length; x++)
    {
        sw.WriteLine(netNames[x].ToString() + ": " + rkNetworking.GetValue(netNames[x]).ToString());
    }
   sw.Close();
}

Компиляция кода

Для этого примера требуются ссылки на следующие пространства имен:

См. также

Основные понятия

Сведения файла журнала

Другие ресурсы

Производительность и диагностика в .NET Compact Framework