2009-05-14 6 views
0

.NET EventLogクラスには制限があるため、PInvokeを使用してアプリケーションログに記録するコードがあります。コードは問題なく動作します。カスタムイベントログへのロギング(C#アプリ、ただしWin32 APIを使用)

今、私はカスタムイベントログに記録したいと思います。だから、私は "companyX"(私のカスタムログ)にRegisterEventSourceの2番目のパラメータを変更しようとしました。 は、 "companyX"(アプリケーションログではなく)に正しく書き込まれましたが、は(個人ログエントリの)ソースフィールドも「companyX」に設定しています。 正しいソース値( "MyAppの")を使って新しい、カスタムイベントログ( "companyX")だけでなく、

  • を使用

    • それでは、どのように私はにコードを変更します

      現在、アプリケーションログ(正しいソース値「MyApp」)で正しく書き込むか、カスタム(「companyX」)イベントログに書き込んで、の間違ったソース値を使用します"MyApp"では、Source値を "companyX"に設定します。カスタムログの名前)。

      EDIT: "companyX"ログはすでに(WIXインストーラコードで)作成されていることに注意してください。

      は、ここに私のコードです:

      private void WriteEntryToLog(string msg, LogEventType entryType) 
      { 
          // ApplicationName = "MyApp" 
          // The code as-is is writing to the Application log. Changing the 2nd param of 
          // the function below to "companyX" allows me to write to my "companyX" event log, 
          // but also changes the Source value of each entry append to that log to "companyX" rather than "MyApp" 
          IntPtr eventSrcHandle = NativeMethods.RegisterEventSource(null, Resources.ApplicationName); 
      
      
          try 
          { 
           uint tokenInfoSize = 0; 
           IntPtr userTokenPtr = WindowsIdentity.GetCurrent().Token; 
           const UInt16 typeError = 1, typeWarning = 2, typeInformation = 4; 
      
           //using this first call, get the length required to hold the token information in the tokenInfoSize parameter 
           bool bresult = NativeMethods.GetTokenInformation(userTokenPtr, NativeMethods.TOKEN_INFORMATION_CLASS.TokenUser, IntPtr.Zero, tokenInfoSize, out tokenInfoSize); 
           if (bresult) throw new Win32Exception(Marshal.GetLastWin32Error()); 
      
           IntPtr userTokenInfo = Marshal.AllocHGlobal((int)tokenInfoSize); 
           try 
           { 
            //get the user token now with the pointer allocated to the right size 
            bresult = NativeMethods.GetTokenInformation(userTokenPtr, NativeMethods.TOKEN_INFORMATION_CLASS.TokenUser, userTokenInfo, tokenInfoSize, out tokenInfoSize); 
            if (!bresult) throw new Win32Exception(Marshal.GetLastWin32Error()); 
      
            UInt16 type = typeError; 
            switch (entryType) 
            { 
             case LogEventType.Error: 
              type = typeError; 
              break; 
             case LogEventType.Warning: 
              type = typeWarning; 
              break; 
             case LogEventType.Information: 
              type = typeInformation; 
              break; 
              default: 
               type = typeInformation; 
               break; 
            } 
      
            NativeMethods.TOKEN_USER tokUser = (NativeMethods.TOKEN_USER)Marshal.PtrToStructure(userTokenInfo, typeof(NativeMethods.TOKEN_USER)); 
      
            string[] message = new string[1]; 
            message[0] = msg; 
            bresult = NativeMethods.ReportEvent(eventSrcHandle, type, 0, 0, tokUser.User.Sid, 1, 0, message, new byte()); 
            if (!bresult) throw new Win32Exception(Marshal.GetLastWin32Error()); 
           } 
           finally 
           { 
            Marshal.FreeHGlobal(userTokenInfo); 
           } 
          } 
          finally 
          { 
           NativeMethods.DeregisterEventSource(eventSrcHandle); 
          } 
      

      }

      ああ、これは、ここで質問の繰り返しではありません。私はこのためのPInvokeを使用する必要があるため Custom value for the Event Log source property for ASP.NET errors 。 =)

  • +0

    .NETのバージョンは何ですか。制限はありますか? –

    +0

    .NET 3.5。 Windowsユーザではなく、「ユーザ」フィールドを「N/A」に設定するという制限があります(ユーザ名によるグループ化/並べ替えは不可能です... 80人の同時端末サーバユーザを持つ顧客の大きな問題です...) – Garrett

    答えて

    1

    MyAppという名前のソースを作成し、ログ "CompanyX"にマップする必要があります。

    この記事では、.NET Framework BCLでイベントソースを作成する方法について詳しく説明します。

    http://msdn.microsoft.com/en-us/library/5zbwd3s3.aspx

    この変更はレジストリへの更新アクセスが必要です。

    +0

    良い推測!元の質問にカスタムログの作成がセットアップ(WIX).MSIによって処理されていることを追加しました。 – Garrett

    関連する問題