由于 .NET EventLog 类的限制,我有一些使用 PInvoke 记录到应用程序日志的代码。该代码可以正常工作。
但是现在,我想登录到自定义事件日志。因此,我尝试将 RegisterEventSource 的第二个参数更改为“companyX”(我的自定义日志)。它正确地写入“companyX”(而不是应用程序日志),但它也将(单个日志条目的)源字段设置为“companyX”,这不是我想要的。
那么如何将代码修改为:
- 使用新的自定义事件日志(“companyX”),但也
- 使用正确的源值(“MyApp”)
目前,它要么正确写入应用程序日志(使用正确的 Source 值“MyApp”),要么写入自定义(“companyX”)事件日志,并使用不正确的Source 值(而不是“MyApp”,它将 Source 值设置为“companyX”,即自定义日志的名称)。
编辑:请注意,“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);
}
}
哦,这不是这里问题的重复: ASP.NET 错误的事件日志源属性的自定义值, 因为我必须为此使用 PInvoke。=)