方法 : ログ ファイルを作成する

更新 : 2007 年 11 月

相互運用性、プログラムの読み込み、およびネットワークに関する診断情報を格納するログ ファイルを作成できます。ログを有効にするには、レジストリ キーを設定します。最初に、ログ全般を有効にするレジストリ キーを設定し、次に、目的のログ コンポーネント用およびオプション用のレジストリ キーを設定します。

レジストリ キーを設定するには、次のような方法があります。

  • Visual Studio でリモート レジストリ エディタを使用できます。

  • .NET Compact Framework 2.0 Service Pack 1 では、リモート パフォーマンス モニタのログ記録オプションを使用できます。リモート パフォーマンス モニタの詳細については、「方法 : 実行時にパフォーマンスを監視する」を参照してください。

  • .NET Compact Framework 3.5 のログ記録ツール NetCFLogging.exe を使用すると、簡単なグラフィカル ユーザー インターフェイスを使ってログを有効および無効にすることができます。このツールは Power Toys for the .NET Compact Framework に含まれています。詳しくは、「Power Toys for .NET Compact Framework」を参照してください。

  • Registry クラスと RegistryKey クラスを使用します。これらは .NET Compact Framework version 2.0 以降のバージョンでサポートされます。

次の表は、ログ ファイルの概要を示しています。

ログ コンポーネント

ログ ファイルの内容

Interop

COM の相互運用呼び出しをログに記録します。プラットフォーム呼び出しの呼び出しおよびマーシャリングについての情報を提供します。

Error

処理不能な例外およびネイティブな例外すべてのログを記録します。エラーはログ ファイルおよび OutputDebugString に記録されます。ログ ファイルは現在のパスにある各アセンブリに対して作成され、現在のセッションが対象になります。最初に処理不能な例外またはネイティブな例外が発生した後は、ログ ファイルは上書きされます。

Loader

プログラムの読み込みに関する情報をログに記録します。ファイル ヘッダーには、次の情報が格納されます。

  • アプリケーション名。

  • Windows Embedded CE によって割り当てられたプロセス ID。

  • ログ ファイルが作成されたローカル日時。形式はグローバルでもカルチャ固有でもありません。

  • .NET Compact Framework のバージョン (たとえば 2.0.5021.00)。

  • プラットフォームに関する情報 (たとえば Windows Embedded CE v5.0.1400 (CEPC) WinCE5x86 debug Dev i386 IJITv2)。

ファイルに含まれている情報は次のとおりです。

  • 強制変換の状態 (互換性モード)。

  • モジュールに割り当てられている、読み込み時の信頼レベル。

  • 解決できないメソッド。

  • 解決できない型。

  • 検出または読み込みできないアセンブリまたはモジュール。

  • アセンブリ読み込みの正常終了。

  • 無効なメタデータのバージョン。

  • 検出できないプラットフォーム呼び出し DLL。

  • プラットフォーム呼び出し DLL 内の検出できない関数。

  • ポリシー ファイル名、またはポリシー ファイルが存在しないという事実。

  • ポリシー ファイル処理中の主なエラー。

  • マネージ アセンブリのポリシー ベースのリダイレクト。

また、グローバル アセンブリ キャッシュに関する情報を含めることもできます。

Networking

ネットワーク トラフィックを記録します。ネットワーク ログ ファイルはバイナリ ファイルであるため、これにアクセスするには .NET Compact Framework のログ ビューア Logviewer.exe が必要です。.NET Compact Framework 3.5 およびそれ以降のバージョンでは、このログ ビューアは Power Toys for the .NET Compact Framework に含まれています。詳細については、「Power Toys for .NET Compact Framework」を参照してください。

ネットワーク ログの記録は Windows Sockets レイヤで行われるため、ログ ファイルにはネットワーク パケット情報だけが記録されます。これには、ネットワークを介して送られたデータが含まれます。データが暗号化されない場合、重要情報が含まれる可能性もあります。

Finalizer

ガベージ コレクタによって破棄される前に、破棄されていないオブジェクトのクラス名をログに記録します。このログは、.NET Compact Framework 3.5 およびそれ以降のバージョンでサポートされます。

オブジェクト名は共通言語ランタイム (CLR: Common Language Runtime) では使用されないので、このログにオブジェクト名は含まれません。それでも、破棄されていないオブジェクトのクラス名は、そのようなオブジェクトの特定に役立ちます。破棄されていないオブジェクトがあると、アプリケーションのパフォーマンスに問題が発生することがあります。

ms229650.alert_note(ja-jp,VS.90).gifメモ :
状況によっては、アプリケーション コードの代わりに .NET Compact Framework がファイナライザを呼び出す場合もあります。

このファイルに含まれる情報は次のとおりです。

  • ファイナライザがオブジェクトに対してガベージ コレクタを実行した時刻を示すタイム スタンプ。

  • 終了処理の行われたオブジェクトのクラス。

Trace

Windows Communication Foundation (WCF) のコード例外をログに記録します。デスクトップの場合、.NET Framework では、トレース、メッセージング、およびイベントの 3 種類のログの記録がサポートされます。.NET Compact Framework の WCF は、コード例外の追跡を目的としてトレース ログの記録だけがサポートされます。ただし、警告メッセージとエラー メッセージは記録されません。

このログは、.NET Compact Framework 3.5 およびそれ以降のバージョンでサポートされます。

ログ ファイルは、既定では、診断対象のアプリケーションが格納されているディレクトリに書き込まれます。ただし、以下のように、レジストリ キーを使用してパスやその他のオプションを指定できます。

  • ログ ファイルの書き込みに別のパスを使用する。別のパスを設定するには、レジストリに対する特権アクセスが必要です。

  • ログ ファイル名にアプリケーション名を含める。

  • ログ ファイル名にプロセス ID を含める。

ログ ファイル名は次の部分で構成されます。ここで、component は "Interop"、"Error"、"Loader"、"Network"、"Finalizer"、または "Trace" です。

netcf_application-name_component_processID.log

アプリケーション名とプロセス ID は省略可能であり、レジストリ設定に基づいています。

たとえば、MyApp.exe という名前のアプリケーションのローダー ログ ファイルは次のような名前になります。

netcf_MyApp_Loader_2066923010.log

相互運用およびローダーなどのログ ファイルを調べる方法については、「ログ ファイル情報」を参照してください。

ログを有効にするには

  • 次の Enabled キーの値を 1 に設定します。

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

    相互運用、ローダー、エラー、ネットワーク、ファイナライザ、トレースの 6 種類のログを有効にするには、このキー値を設定する必要があります。Logging の下のサブキーは、既定では存在しません。

    この値を 0 (ゼロ) に設定すると、すべてのログをオフにできます。

ログ ファイルのパスを指定するには (オプション)

  • 次の Path キーの値を、ログ ファイルの場所を表す文字列に設定します。

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

    レジストリへの書き込みを許可されたアプリケーションだけが、このキーにアクセスできます。パスを指定しなかった場合、ログ ファイルは、アプリケーションが格納されているディレクトリに書き込まれます。

ログ ファイル名にアプリケーション名を含めるには (オプション)

  • 次の UseApp キーの値を 1 に設定します。

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

    複数のアプリケーションを実行し、アプリケーションごとに個別のログ ファイルが必要な場合には、このキーが役立ちます。2 つのアプリケーションが同じディレクトリにログ ファイルを書き込む場合、最初のアプリケーションが書き出したログ ファイルは、2 番目のアプリケーションの実行時に新しいログ ファイルによって常に上書きされます。UseApp キーを使用すると、ログ ファイルを分けることができます。

ログ ファイル名にプロセス ID を含めるには (オプション)

  • 次の UsePid キーの値を 1 に設定します。

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

    1 つのアプリケーションを複数回にわたって実行し、インスタンスごとに個別のログを作成する必要がある場合には、このキーが役立ちます。これを設定すると、ログ ファイル名にプロセス ID が追加されるため、アプリケーションのインスタンスごとに、ログ ファイルが別の名前で新しく作成されます。

イベントを発生時に記録するには (オプション)

  • 次の Flush キーの値を 1 に設定します。

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

    この値を設定すると、共通言語ランタイム (CLR) は、ログ イベントの発生時にログ イベントをログ ファイルに書き込みます。設定しない場合は、まずバッファに保持し、バッファが満杯になってからログに書き込みます。この設定によってアプリケーションのパフォーマンスが低下し、アプリケーションの処理のタイミングが少しずれる可能性があります。それでも、アプリケーションの障害その他のエラーに関連した問題を診断する際、エラーの原因となった最後の数個のイベントを調べるには、これが役立ちます。このキーが存在しない場合、または設定されない場合には、バッファが満杯になるまでデータはログ ファイルに書き込まれません。

Interop ログ

相互運用 (Interop) ログを有効にするには

  • 次の Enabled キーの値を 1 に設定します。

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

Error ログ

エラー ログを有効にするには

  • 次の Enabled の値を 1 に設定します。

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

Loader ログ

ローダー ログを有効にするには

  • 次の Enabled の値を 1 に設定すると、ローダーのログが有効になります。2 に設定すると、ローダーとグローバル アセンブリ キャッシュのログが有効になります。

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

Networking ログ

ネットワーク ログを有効にするには

  • 次の Enabled の値を 1 に設定します。

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

    ネットワーク ログ ファイルはバイナリ ファイルであるため、これを確認するには .NET Compact Framework のログ ビューア Logviewer.exe が必要です。このビューアは、バイナリ形式から人間にとって判読可能な形式にログを変換します。.NET Compact Framework 3.5 以降では、このログ ビューアは Power Toys for the .NET Compact Framework に含まれています。このツールは、「.NET Compact Framework ダウンロード」ページからダウンロードできます。

Finalizer ログ

ファイナライザ ログを有効にするには

  • 次の Enabled の値を 1 に設定します。

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

Trace ログ

WCF トレース ログを有効にするには

  • 次の Enabled の値を 1 に設定します。

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

使用例

レジストリ キー値を設定するには、リモート レジストリ エディタを使用するか、値を設定するアプリケーションを作成することができます。このセクションの例には、レジストリに対して必要な操作を行う次のようなメソッドが含まれています。

  • EnableLogging メソッドは、ログ全般を有効にします。このメソッドには、ログ ファイル用の別のパスを指定し、アプリケーション名とプロセス ID をログ ファイル名に追加するかどうか指定し、イベント発生時にイベントをログに記録するかどうかを指定するパラメータが含まれています。

  • 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 でのパフォーマンスと診断