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