Не удалось добавить пакет Microsoft.Extensions.Logging.EventLog с приложением.NET Core 2
Так что согласно документации MS мы можем добавить EvventLog в качестве одного из провайдеров журналов. Однако, когда я добавляю Microsoft.Extensions.Logging.EventLog
пакет в моем приложении.NET Core 2 Web Api. Я вижу желтую метку объяснения, как показано ниже
С таким предупреждением я все еще смог добавить EventLog в метод BuildWebHost
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseApplicationInsights()
.UseUrls("http://*:40006")
.ConfigureLogging((hostingContext,logging)=>
{
logging.AddEventLog(new Microsoft.Extensions.Logging.EventLog.EventLogSettings()
{
SourceName = "MySource",
});
})
.Build();
Однако, когда я запускаю приложение, я получаю ошибку
Не удалось загрузить тип 'System.Diagnostics.EventLog' из сборки 'Система, версия =4.0.0.0, культура = нейтральная, PublicKeyToken=b77a5c561934e089'.'
и предупреждение
Код серьезности Описание Состояние подавления строки файла проекта Предупреждение NU1701 Пакет "Microsoft.Extensions.Logging.EventLog 2.0.0" был восстановлен с использованием ".NETFramework,Version=v4.6.1" вместо целевой структуры проекта ".NETCoreApp,Version=v2.0'. Этот пакет может быть не полностью совместим с вашим проектом.
2 ответа
При использовании 2.0 вам нужно добавить ссылку на пакет Microsoft.Windows.Compatibility
как описано в ASP.NET Core и Windows Event Log.
У меня был некоторый успех с этим в.NET Core 2.x:
using System;
using System.Runtime.InteropServices;
namespace Foo
{
public enum EventLogType
{
EVENTLOG_SUCCESS = 0x000,
EVENTLOG_AUDIT_FAILURE = 0x0010,
EVENTLOG_AUDIT_SUCCESS = 0x0008,
EVENTLOG_ERROR = 0x0001,
EVENTLOG_INFORMATION = 0x0004,
EVENTLOG_WARNING = 0x0002
}
public static class EventLog
{
[DllImport("advapi32.dll", EntryPoint = "RegisterEventSource", SetLastError = true)]
public static extern long RegisterEventSource(string lpUNCServerName, string lpSourceName);
[DllImport("advapi32.dll", EntryPoint = "DeregisterEventSource", SetLastError = true)]
public static extern int DeregisterEventSource(IntPtr hHandle);
[DllImport("advapi32.dll", SetLastError = true)]
static extern int ReportEvent(IntPtr hHandle, ushort wType, ushort wCategory, uint dwEventID, IntPtr uSid, ushort wStrings, uint dwDataSize, string[] lpStrings, byte bData);
public static void Write(string source, string message, EventLogType type)
{
int lastError = -1;
IntPtr handle = IntPtr.Zero;
string[] strs = new string[2];
long rawHandle64 = RegisterEventSource(null, source);
handle = new IntPtr(rawHandle64);
lastError = Marshal.GetLastWin32Error();
if (lastError == 0)
{
strs[0] = source;
strs[1] = message;
int res = ReportEvent(handle, (ushort)type, 0, 0, IntPtr.Zero, 2, 0, strs, 0);
lastError = Marshal.GetLastWin32Error();
DeregisterEventSource(handle);
lastError = Marshal.GetLastWin32Error();
}
}
}
}