Моя пользовательская служба Windows не записывает в мой пользовательский журнал событий

Я написал пользовательскую службу Windows, которая записывает данные в пользовательский журнал событий (в средстве просмотра событий Windows).

Для разработки бизнес-логики, которую использует служба, я создал форму Windows, которая имитирует методы запуска / остановки службы Windows.

При выполнении логики biz через Windows Forms информация успешно записывается в мой пользовательский журнал событий. Однако, когда я запускаю ту же логику бизнес-процесса из пользовательской службы Windows, информация не записывается в журнал событий.

Чтобы было ясно, я написал библиотеку (.dll), которая выполняет всю работу, которую я хочу, чтобы моя настраиваемая служба выполняла, включая создание / запись в настраиваемый журнал событий. Мое приложение Form ссылается на эту библиотеку, как и моя служба Windows.

Считая, что проблема связана с безопасностью, я вручную установил для настраиваемой службы Windows "Вход в систему" ​​под именем "Администратор", но служба по-прежнему не выполняла запись в журнал событий.

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

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

3 ответа

Решение

Я обнаружил, почему мой сервис не записывал в журнал событий.

Проблема не имела никакого отношения к какой-либо части кода / безопасности / и т. Д., Которая пыталась записать в EL. Проблема заключалась в том, что моя служба не собирала информацию, которая была записана в EL, и поэтому служба даже не пыталась записать журнал.

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

Я открыт для того, чтобы этот вопрос был закрыт, так как вопрос не соответствовал реальной проблеме.

Я использую это так. Там могут быть некоторые опечатки. Написал в браузере телефона...

public class MyClass
{
   private EventLog eventLog = new EventLog();

   public void MyClass()
   {
      if (!System.Diagnostics.EventLog.SourceExists("MyLogSource"))
          System.Diagnostics.EventLog.CreateEventSource("MyLogSource", "MyLogSource_Log");
      eventLog.Source = "MyLogSource";
      eventLog.Log = "MyLogSource_Log";
   }

   private void MyLogWrite()
   {
       eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
   } 

}

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

Вы также можете добавить проверку параметров в основную точку входа и иметь комбинацию службы и консольного приложения, которое будет запускаться на основе некоторого флага. Посмотрите это ТАК сообщение для хорошего примера, но вот фрагмент:

using System;
using System.ServiceProcess;

namespace WindowsService1
{
    static class Program
    {
        static void Main(string[] args)
        {
            if (args == null)
            {
                Console.WriteLine("Starting service...");
                ServiceBase.Run(new ServiceBase[] { new Service1() });
            }
            else
            {
                Console.WriteLine("Hi, not from service: " + args[0]);
            }
        }
    }
}

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

Другие вопросы по тегам