Пошаговое руководство. Создание файла журнала
Обновлен: Ноябрь 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. Файл журнала создается для каждой сборки текущего пути и используется для текущей сессии. После первого возникновения необработанного или машинного исключения, файл журнала перезаписывается. |
Загрузчик |
Журнальная информация о загрузке программ. Заголовок файла содержит следующие данные:
Файл содержит следующие сведения.
Можно включить информацию о глобальном кэше сборок. |
Сетевое взаимодействие |
Хранит данные о сетевом трафике. Файл журнала сети двоичный, и его нельзя просмотреть без средства просмотра журналов .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. Но имена классов неуничтоженных объектов могут помочь идентифицировать эти объекты. Неуничтоженные объекты могут создавать проблемы производительности в приложениях.
Примечание.
В некоторых случаях .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();
}
Компиляция кода
Для этого примера требуются ссылки на следующие пространства имен: