Я уже нашел несколько тем по этому вопросу, но каким-то образом им всем удалось избежать реального решения проблемы / предположил очевидное.
(например, здесь , здесь, здесь , здесь , здесь )
Я проверяю и создаю новый журнал событий + источник во время установки и определяю они должны быть использованы во время работы, но все же каким-то образом события «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"
указывать не нужно, поскольку источник уже зарегистрирован в журнале.