Comment : créer des fichiers journaux
Mise à jour : novembre 2007
Vous pouvez créer des fichiers journaux contenant des informations de diagnostic sur l'interopérabilité, le chargement du programme et le réseau. Vous pouvez activer l'enregistrement dans un journal en définissant les clés de Registre. En premier lieu, définissez une clé de Registre pour activer l'enregistrement en général, puis définissez les clés de Registre pour le composant et les options de journal souhaités.
Vous pouvez utiliser les méthodes suivantes pour définir des clés de Registre :
Utilisez l'outil Remote Registry Editor dans Visual Studio.
Dans .NET Compact Framework 2.0 Service Pack 1, utilisez les options d'enregistrement dans l'Analyseur de performances distant. Pour plus d'informations sur l'Analyseur de performances distant, consultez Comment : analyser les performances au moment de l'exécution.
Dans .NET Compact Framework 3.5, vous pouvez utiliser l'outil d'enregistrement NetCFLogging.exe qui fournit une interface utilisateur graphique simple pour activer et désactiver l'enregistrement. Cet outil est inclus dans les Power Toys pour le .NET Compact Framework. Pour plus d'informations, consultez Power Toys pour le .NET Compact Framework (en anglais).
Utilisez les classes Registry et RegistryKey prises en charge dans le .NET Compact Framework version 2.0 et versions ultérieures.
Le tableau ci-dessous récapitule les fichiers journaux.
Composant de journal |
Contenu du fichier journal |
||
---|---|---|---|
Interopérabilité |
Enregistre des appels COM Interop. Fournit des informations sur les appels et le marshaling d'appel de code non managé. |
||
Erreur |
Enregistre toutes les exceptions natives et non gérées. Les erreurs sont enregistrées dans un fichier journal et dans OutputDebugString. Le fichier journal est créé pour chaque assembly dans le chemin d'accès actuel et s'applique à la session actuelle. Après la première occurrence d'une exception native ou non gérée, le fichier journal est remplacé. |
||
Chargeur |
Enregistre des informations sur le chargement du programme. L'en-tête de fichier contient les informations suivantes :
Le fichier fournit les informations suivantes :
Vous pouvez également inclure des informations concernant le Global Assembly Cache. |
||
Réseau |
Enregistre le trafic réseau. Le fichier journal du réseau est binaire et ne peut pas être lu sans la visionneuse du journal du .NET Compact Framework, Logviewer.exe. Dans le .NET Compact Framework 3.5 et versions ultérieures, la visionneuse du journal est incluse dans les Power Toys pour le .NET Compact Framework. Pour plus d'informations, consultez Power Toys pour le .NET Compact Framework (en anglais). Étant donné que l'enregistrement réseau se produit au niveau de la couche Windows Sockets, le fichier journal contient seulement des données de paquet réseau, comme celles envoyées sur le réseau qui peuvent être sensibles si elles ne sont pas chiffrées. |
||
Finaliseur |
Enregistre le nom de classe des objets qui ne sont pas supprimés avant d'être ignorés par le garbage collector. Ce journal est pris en charge dans le .NET Compact Framework 3.5 et versions ultérieures. Les noms d'objet ne sont pas inclus dans le journal, car ces noms ne sont pas disponibles au Common Language Runtime (CLR). Toutefois, les noms de classe pour les objets non supprimés peuvent aider à identifier ces objets. Les objets non supprimés peuvent créer des problèmes de performances dans les applications.
Ce fichier comporte les informations suivantes :
|
||
Trace |
Enregistre les exceptions de code pour Windows Communication Foundation (WCF). Sur le bureau, le .NET Framework prend en charge trois types de journalisation : trace (suivi), messagerie et enregistrement des événements. WCF sur le .NET Compact Framework prend en charge uniquement la journalisation du suivi pour suivre les exceptions de code, mais n'enregistre pas les messages d'avertissement et d'erreur. Ce journal est pris en charge dans le .NET Compact Framework 3.5 et versions ultérieures. |
Par défaut, les fichiers journaux sont écrits dans le répertoire qui contient l'application diagnostiquée. Toutefois, vous pouvez spécifier un autre chemin d'accès et d'autres options avec les clés de Registre, comme suit :
utiliser un autre chemin d'accès pour écrire les fichiers journaux ; cela requiert un accès privilégié au Registre sécurisé ;
inclure le nom de l'application dans le nom du fichier journal ;
inclure l'ID de processus dans le nom du fichier journal.
Le nom d'un fichier journal se compose des parties suivantes, où composant correspond à "Interopérabilité", "Erreur", "Chargeur", "Réseau", "Finaliseur" ou "Trace".
netcf_nom-application_composant_IDprocessus.log
Le nom de l'application et l'ID de processus sont facultatifs et reposent sur les paramètres du Registre.
Par exemple, un fichier journal de chargeur pour une application nommée "MyApp.exe" pourrait s'intituler comme suit :
netcf_MyApp_Loader_2066923010.log
Pour plus d'informations sur l'examen des fichiers journaux, tels que les fichiers d'interopérabilité et les fichiers de chargeur, consultez Informations sur le fichier journal.
Pour activer l'enregistrement dans le journal
Affectez 1 à la valeur de clé Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Enabled
Cette valeur de clé doit être définie pour activer les six types d'enregistrement (interopérabilité, chargeur, erreur, réseau, finaliseur et trace). Notez que les sous-clés sous Logging n'existent pas par défaut.
Vous pouvez désactiver tout enregistrement en affectant la valeur 0 (zéro).
Pour spécifier un chemin d'accès pour le fichier journal (facultatif)
Affectez à la valeur de clé Path suivante une chaîne qui représente l'emplacement des fichiers journaux :
HKLM\Security\.NETCompactFramework\Diagnostics\Logging\Path
Seules les applications pouvant écrire dans le Registre sécurisé peuvent accéder à cette clé. Si aucun chemin d'accès n'est spécifié, le fichier journal est écrit dans le répertoire qui contient l'application.
Pour inclure l'application dans le nom (facultatif)
Affectez 1 à la valeur de clé UseApp suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\UseApp
Cette clé est utile si vous souhaitez exécuter plusieurs applications et obtenir des fichiers journaux distincts pour chaque application. Si deux applications écrivent des fichiers journaux dans le même répertoire, le fichier journal le plus ancien est toujours remplacé par le fichier journal le plus récent lorsque la deuxième application est exécutée. La clé UseApp peut être utilisée comme différentiateur pour le fichier journal.
Pour inclure l'ID de processus dans le nom (facultatif)
Affectez 1 à la valeur de clé UsePid suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\UsePid
Cette clé est utile si vous souhaitez exécuter une application plusieurs fois et créer des journaux distincts pour chaque instance. Ce paramètre ajoute l'ID de processus au nom du fichier journal ; ainsi, chaque instance de l'application crée un fichier journal avec un nom différent.
Pour enregistrer les événements au moment où ils se produisent (facultatif)
Affectez 1 à la valeur de clé Flush suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Flush
Cette valeur provoque l'écriture, par le Common Language Runtime (CLR), des événements de journal dans le fichier journal lorsqu'ils se produisent au lieu de les conserver dans la mémoire tampon et de les écrire lorsque cette dernière est pleine. Ce paramètre a une incidence négative sur la performance de l'application et peut modifier légèrement le minutage de l'application. Toutefois, il peut être utile pour diagnostiquer des problèmes liés aux échecs d'application ou les autres erreurs pour lesquelles vous souhaiterez éventuellement consulter les derniers événements qui ont provoqué l'erreur. Si cette clé est absente ou n'est pas définie, les données ne sont écrites dans les fichiers journaux que lorsque la mémoire tampon est pleine.
Enregistrement d'interopérabilité
Pour activer l'enregistrement d'interopérabilité
Affectez 1 à la valeur de clé Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Interop\Enabled
Enregistrement des erreurs
Pour activer l'enregistrement des erreurs
Affectez 1 à la valeur Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Error\Enabled
Enregistrement de chargeur
Pour activer l'enregistrement de chargeur
Affectez 1 à la valeur Enabled suivante afin d'activer l'enregistrement pour le chargeur ou 2 afin d'activer l'enregistrement pour le chargeur et le Global Assembly Cache :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Loader\Enabled
Enregistrement de réseau
Pour activer l'enregistrement de réseau
Affectez 1 à la valeur Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Networking\Enabled
Le fichier journal du réseau est binaire et ne peut pas être lu sans la visionneuse du journal du .NET Compact Framework, Logviewer.exe, qui convertit le format binaire du journal en un format lisible par l'utilisateur. Dans le .NET Compact Framework 3.5 et versions ultérieures, la visionneuse du journal est incluse dans les Power Toys pour le .NET Compact Framework. Vous pouvez télécharger cet outil à partir de la page Téléchargements du .NET Compact Framework (en anglais).
Enregistrement de finaliseur
Pour activer l'enregistrement de finaliseur
Affectez 1 à la valeur Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\Finalizer\Enabled
Enregistrement de trace
Pour activer l'enregistrement de trace WCF
Affectez 1 à la valeur Enabled suivante :
HKLM\Software\Microsoft\.NETCompactFramework\Diagnostics\Logging\WCF\Enabled
Exemple
Vous pouvez définir les valeurs de clé de Registre à l'aide de l'outil Remote Registry Editor ou écrire une application qui définira les valeurs. L'exemple de cette section contient les méthodes suivantes qui gèrent les tâches de Registre nécessaires :
La méthode EnableLogging active l'enregistrement en général et contient des paramètres qui permettent de spécifier un autre chemin d'accès pour le fichier journal, d'indiquer si le nom de l'application et l'ID de processus seront ajoutés au nom du fichier journal et de préciser si les événements seront enregistrés dès qu'ils se produisent.
Les méthodes SetInteropLogging, SetLoaderLogging et SetNetworkLogging affectent 1 à la valeur de clé Enabled correspondante afin que l'enregistrement de ce composant soit activé.
La méthode DisableLogging désactive tout enregistrement.
La méthode WriteLoggingSettings examine de manière récursive les clés se trouvant sous la sous-clé Logging et écrit leurs noms et valeurs de clé dans un fichier journal. Le fichier journal s'intitule "logsettings.txt" et se trouve dans le répertoire qui contient cet exemple d'application.
' 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();
}
Compilation du code
Cet exemple nécessite des références aux espaces de noms suivants :
Voir aussi
Concepts
Informations sur le fichier journal