AksPat Ответов: 1

Как записать события из нескольких приложений (источников) в один и тот же журнал событий?


Я создал пользовательский журнал событий и хотел бы, чтобы все мои приложения записывались в один и тот же журнал событий. (Вы сможете увидеть, как это происходит в вашем окно просмотра событий в журналах Windows.)
Точно так же у меня есть 2 службы, которые я хочу записать в один и тот же журнал событий. Я попытался сделать это, создав один журнал событий и передав разные имена источников из 2 созданных мной служб Windows. Но я нахожу только одну службу, пишущую в журнал, в то время как другая этого не делает.

Кроме того, когда я пытаюсь остановить службы, Служба 1 не останавливается и выдает ошибку.
Ошибка гласит "Windows не смогла остановить службу "имя службы" на локальном компьютере. Ошибка 1061: в настоящее время служба не может принимать управляющие сообщения."

Что я уже пробовал:

Ниже приведена библиотека классов, которую я создал для журнала событий.

public class EventLogger
{
    private EventLog eventLog1 = new System.Diagnostics.EventLog();

    public EventLogger(string logSource)
    {
        if (!System.Diagnostics.EventLog.SourceExists(logSource))
        {
            System.Diagnostics.EventLog.CreateEventSource(logSource, "SampleLog");
        }
        eventLog1.Source = logSource;
        eventLog1.Log = "SampleLog";
    }

    public void WriteLog(string message)
    {
        eventLog1.WriteEntry(message);
    }
}


Создан 1-й сервис Windows
public partial class Service1 : ServiceBase
{
    private EventLogger.EventLogger eventLog;
    public Service1()
    {
        InitializeComponent();
        eventLog = new EventLogger.EventLogger("WinService1");
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            eventLog.WriteLog("Service started in 1st");
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry(ex.ToString());
        }
    }

    protected override void OnStop()
    {
        eventLog.WriteLog("Service stopped");
    }
}


Создал 2-ю службу windows, а также, как и выше.

public partial class Service2 : ServiceBase
{
    private EventLogger.EventLogger eventLog;
    public Service2()
    {
        InitializeComponent();
        eventLog = new EventLogger.EventLogger("WinService2");
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            eventLog.WriteLog("Service started in 2nd");
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry(ex.ToString());
        }
    }

    protected override void OnStop()
    {
        eventLog.WriteLog("Service stopped");
    }
}


Service1, кажется, ничего не регистрирует, в то время как я вижу журналы для Service2. Возможно, я делаю здесь много неправильных вещей. Пожалуйста, помогите мне найти решение этой проблемы. Кроме того, если это может быть достигнуто с помощью log4Net, то решения в этом отношении также приветствуются. заранее спасибо.

Jochen Arndt

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

Многие здесь не будут открывать внешние (графические) ссылки, и ваши ссылки генерируют страницу ошибки 502 Bad Gateway.

AksPat

Удалил ссылки и обновил вопрос.

1 Ответов

Рейтинг:
0

Jochen Arndt

Это может не решить вашу проблему, но есть кое-что, о чем стоит упомянуть:

Вы не можете использовать EventLog сразу после его регистрации, потому что системе нужно некоторое время, чтобы обновить список зарегистрированных источников. Поэтому рекомендуется создать его во время установки или выйти из приложения после регистрации при первом выполнении:

Цитата:
Создайте новый источник событий во время установки приложения. Это позволяет операционной системе обновить список зарегистрированных источников событий и их конфигурацию. Если операционная система не обновила свой список источников событий и вы попытаетесь записать событие с новым источником, операция записи завершится неудачей.
Поскольку вы, вероятно, уже несколько раз запускали свои услуги, источники должны были быть зарегистрированы. Но вы должны учитывать этот факт при установке на другие машины.

Также нет необходимости устанавливать Log собственность, когда Source был установлен:
Цитата:
Когда вы пишете запись в журнале, система использует Источник, чтобы найти соответствующий журнал, в который будет помещена ваша запись
Установка Log свойство предоставляется для чтения лог-файлов.

Все цитаты со страниц журнала событий MSDN (например, Журнал событий.Метод CreateEventSource (String, String) (System.Диагностика)[^]).

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