Как мне написать в пользовательский источник событий, используя ILoggerFactory ядра .net? Есть ли способ указать источник? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь записать в пользовательский источник событий в .netcore / c #, но не нашел способа указать целевой источник объекта регистратора ядра .net. В этом случае я хочу записать в «Мой журнал событий», а не в журнал приложений. Приведенный ниже код успешно записывается в журнал приложений, но я хочу указать его на источник событий «Мой журнал событий».

if (!EventLog.SourceExists("My Event Log"))
{
    EventLog.CreateEventSource("My Event Log", "My Program");
}

ILoggerFactory loggerFactory = new LoggerFactory()
        .AddConsole()
        .AddDebug()
        .AddEventLog();

ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("DAILY LOAD starting...");

1 Ответ

0 голосов
/ 19 января 2019

Код и пояснения, приведенные ниже, позволили моему консольному приложению .NETCore / C # успешно записать в «журнал пользовательских приложений» в средстве просмотра событий БЕЗ ИД события Описание ошибки (см. ВЫПУСК # 1 ИСПРАВЛЕНИЕ если у вас возникла эта проблема).

//libraries needed..
//using Microsoft.Extensions.Logging;
//using Microsoft.Extensions.Logging.EventLog;

string _sourceName = "My Program"; //source program name
string _logName = "My Event Log"; //new event log or targeted event log name

//if custom event log does not exist, create it
if (!EventLog.SourceExists(_logName))
{
    //event log creates new app log and associates program, "My Program", with new log, "My Event Log"
    EventLog.CreateEventSource(_sourceName, _logName);
}

EventLogSettings myEventLogSettings = new EventLogSettings
    {
        SourceName = _sourceName,
        LogName = _logName
    };

ILoggerFactory loggerFactory = new LoggerFactory()
            .AddConsole()
            .AddDebug()
            .AddEventLog(myEventLogSettings);

ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation(1000, "DAILY LOAD starting...");

ПРИМЕЧАНИЕ # 1 : если вы изменяете целевой журнал существующей исходной программы ... или другими словами, если вы перенаправляете программу, которая УЖЕ записывает в журнал событий, это потребует перезагрузки для регистрации. Если журнал создан заново, он будет успешно записан. Дополнительную информацию смотрите в этой теме: Журнал событий Windows - как зарегистрировать источник событий?

ВЫПУСК # 1 : Когда вы открываете программу просмотра событий, чтобы взглянуть на первое событие журнала настраиваемого приложения, вы увидите, что ваше событие скрыто в сообщении об ошибке .

Не найдено описание для идентификатора события 0 из источника Моя программа. Либо компонент, который вызывает это событие, не установлен на локальном компьютере, либо установка повреждена. Вы можете установить или восстановить компонент на локальном компьютере. Если событие возникло на другом компьютере, отображаемая информация должна была быть сохранена вместе с событием. Следующая информация была включена в событие: MyProgram ЕЖЕДНЕВНАЯ ЗАГРУЗКА начинается ... ресурс сообщения присутствует, но сообщение не найдено в таблице строк / сообщений

ISSUE # 1 FIX : новый журнал приложения либо ссылается на несуществующий файл таблицы сообщений, либо передаваемый EventId НЕ находится в таблице сообщений. Самый простой способ решить эту проблему - сделать так, чтобы ваш журнал ссылался на существующий файл таблицы сообщений (например, .NET Runtime) и передавал ему документированный EventId (я использовал 1000). Это требует изменения реестра, шаги ниже (статья для справки и скриншоты) :

  1. Открыть реестр
  2. Перейдите к компьютеру \ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog
  3. Нажмите на папку нового журнала событий. В данном случае «Мой журнал событий».
  4. Создать новую строку в папке.

    Значение name = "EventMessageFile"
    Значение data = "C: \ Windows \ System32 \ mscoree.dll"

ВАЖНО : путь Data Value выше ссылается на существующую таблицу .NET Runtime Message, вы можете ссылаться на другую таблицу сообщений, если хотите. Поскольку таблица сообщений .NET Runtime НЕ имеет EventID, равного 0, я продолжал получать ту же ошибку. После того, как я изменил идентификатор события, передаваемый в существующее значение в таблице .NET Runtime Message (в данном случае 1000), он заработал, как и ожидалось, без сообщения об ошибке!

...