Почему WriteEntry не работает для этого источника EventLog? - PullRequest
3 голосов
/ 19 августа 2011

Я пишу простой сервис и регистрирую исключения и другие заметные элементы в EventLog.Ниже приведен код сервиса.Почему-то, хотя я вижу журнал "FDaemon", я не вижу в нем никаких событий.Мои запущенные и остановленные события нигде в журнале;В журнале перечислены 0 событий.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;

namespace FDaemon
{
    public class EmailDigester : ServiceBase, IDebuggableService
    {
        private Timer digestTimer;
        private EmailDigesterWorker worker;
        private EventLog eventLog;

        public EmailDigester()
        {
            // fire up the event log
            this.eventLog = new System.Diagnostics.EventLog();

            ((ISupportInitialize)(this.eventLog)).BeginInit();

            this.eventLog.Source = "EmailDigester";
            this.eventLog.Log = "FDaemon";
            if (!EventLog.SourceExists(this.eventLog.Source))
            {
                EventLog.CreateEventSource(this.eventLog.Source, this.eventLog.Log);
            }

            this.AutoLog = false;
            this.ServiceName = this.eventLog.Source;

            ((ISupportInitialize)(this.eventLog)).EndInit();
        }

        public void DebugStart(string[] args)
        {
            this.OnStart(args);
        }

        protected override void OnStart(string[] args)
        {
            this.worker = new EmailDigesterWorker(1, eventLog);

            // no need to multithread, so use a simple Timer
            // note: do not take more time in the callback delegate than the repetition interval
            if (worker.RunTime.HasValue)
            {
                worker.ServiceStarted = true;
                TimerCallback work = new TimerCallback(this.worker.ExecuteTask);

                TimeSpan daily = new TimeSpan(24, 0, 0);  // repeat every 24 hrs
                TimeSpan startIn; // how much time till we start timer  
                if (worker.RunTime <= DateTime.Now)
                    startIn = (worker.RunTime.Value.AddDays(1.00) - DateTime.Now); // runTime is earlier than now. we missed, so add a day to runTime
                else
                    startIn = (worker.RunTime.Value - DateTime.Now);

                this.digestTimer = new Timer(work, null, startIn, daily);
            }

            eventLog.WriteEntry("EmailDigester started.", EventLogEntryType.Information);
        }

        public void DebugStop()
        {
            this.OnStop();
        }

        protected override void OnStop()
        {
            worker.ServiceStarted = false; 
            if (this.digestTimer != null)
            {
                this.digestTimer.Dispose();
            }

            eventLog.WriteEntry("EmailDigester stopped.", EventLogEntryType.Information);
        }
    }
}

1 Ответ

4 голосов
/ 19 августа 2011

Во-первых: я предполагаю, что вы прошли, и функция WriteEntry() фактически выполняет.

Если ваш источник "EmailDigester" зарегистрирован с любым другим EventLogs (например, Приложение, Безопасность и т. Д.), То сообщения будут отображаться в этом EventLog независимо от того, что вы делаете. На самом деле, я считаю, что считаются только первые 8 символов источника.

Вы можете проверить это, зайдя в реестр @: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\ и проверка источников каждого журнала.

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

...