Правильный способ настроить и использовать пользовательский журнал событий. NET сервис? - PullRequest
0 голосов
/ 11 марта 2020

Я уже нашел несколько тем по этому вопросу, но каким-то образом им всем удалось избежать реального решения проблемы / предположил очевидное.
(например, здесь , здесь, здесь , здесь , здесь )

Я проверяю и создаю новый журнал событий + источник во время установки и определяю они должны быть использованы во время работы, но все же каким-то образом события «EventSourceName» попадают в журнал приложений.

Почему это так?


Вот фрагменты моего кода:

Установщик:

namespace Service_Name
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            if (!System.Diagnostics.EventLog.SourceExists("EventSourceName"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "EventSourceName", "EventLogName");
            }
            InitializeComponent();
        }

        private void serviceProcessInstaller1_AfterInstall(object sender, InstallEventArgs e)
        {

        }
    }
}

Сервис:

public Service_Name()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    ServiceEventLog = new EventLog();
    ServiceEventLog.Source = "EventSourceName"; // This is different from Service Name
    ServiceEventLog.Log = "EventLogName"; // This is different from Service Name
    ..
    ServiceEventLog.WriteEntry("Service Init");
    Worker = new Thread(CodeWorker);
    Worker.Start();
}

private void CodeWorker()
{
    //.. operational code
    while (true)
    {
        try
        {
            //.. operational code
            ServiceEventLog.WriteEntry("<operational event data here>", (EventLogEntryType)4, 0);
        }
        catch (Exception Error)
        {
            ServiceEventLog.WriteEntry(string.Format("<error event data here>", (EventLogEntryType)1, 0);
            throw;
        }
        //.. operational code
    }
}

Как оказалось, код работает как Однако при работе с журналом событий важно помнить:

Метод EventLog.CreateEventSource имеет важную сноску:

Если источник уже сопоставлены с журналом, и вы переназначаете его в новый журнал, необходимо перезагрузить компьютер, чтобы изменения вступили в силу.

Ранее я сопоставил источник с другим журналом событий, который был назван так же, как и сама служба. Использование того же имени, что и у самой службы, вызвало множество других проблем, и я решил исправить это с помощью другого имени журнала, но не перезапускал тестовую систему до проведения тестов на новой версии кода.

Но, как отметил Кайус Джард ниже, части кода являются избыточными:
ServiceEventLog.Log = "EventLogName" указывать не нужно, поскольку источник уже зарегистрирован в журнале.

1 Ответ

2 голосов
/ 11 марта 2020

Документация гласит: «Если вы измените свойство Log после того, как свойство Source было установлено, при записи в журнал выдается исключение.».

Пример кода в MSDN просто устанавливает свойство Source и затем вызывает WriteEvent, затем он не устанавливает журнал заранее или после установки Source

Я рекомендую удалить вызов для установки свойства Log; Я подозреваю, что ваш вызов WriteEvent падает, и попытка перехвата вызова в перехвате также приводит к сбою. Возможно, это не идеальная структура кода, чтобы «попытаться записать в этот журнал, и если это не удастся, попробуйте записать в этот журнал», если это не «запись в журнал»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...