Моя пользовательская служба 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]);
}
}
}
}
Вышеприведенное запускает приложение в режиме консоли, если есть какие-либо параметры, и в режиме обслуживания, если нет параметров. Конечно, это может быть гораздо интереснее, но это суть переключателя.