Служба Windows .Net и пользовательские прослушиватели трассировки - PullRequest
1 голос
/ 10 июля 2010

У меня вся служебная логика инкапсулирована в библиотеке классов.Когда я создаю экземпляр библиотеки классов в приложении командной строки, я получаю информацию о трассировке.

Когда я создаю экземпляр класса в службе Windows, я вижу, что мой пользовательский прослушиватель трассировки создал каталог logs и запустил файл,но он остается 0 КБ.

Оба приложения имеют это в .config:

 <system.diagnostics>
<switches>
  <add name="PTraceSwitch" value="Verbose" />
</switches>
<trace autoflush="true">
  <listeners>
    <add name="CustomXmlWriterTraceListener" />
    <add name="MyServiceEventListener"  />
    <remove name="Default" />
  </listeners>
</trace>
<sharedListeners>
  <add
     type="CustomUtilities.CustomXmlWriterTraceListener, CustomUtilities"
     name="CustomXmlWriterTraceListener"
     initializeData="Logs\MyService.svclog"
     RollLogAtMidnight="True"
     DateFormat="yyyy.MM.dd"
     MaxFileSizeMB="1"
     CompressLogsOlderThanTimeSpan="1.00:0:00"
     DeleteLogsOlderThanTimeSpan="30.00:00:00"/>

  <add name="MyServiceEventListener"
       type="System.Diagnostics.EventLogTraceListener"
       initializeData="MyServiceEventLog">
    <filter type="System.Diagnostics.EventTypeFilter"
      initializeData="Warning" />
  </add>
</sharedListeners>

1 Ответ

0 голосов
/ 12 июля 2010

Кажется, что мой CustomXmlWriterTraceListener ведет себя по-разному при запуске со службой, чем библиотека классов или exe.

Я добавил это к своему сервису, чтобы отладить основную точку входа и пройти инициализацию моего слушателя:

Debugger.Launch();

Основной Writer равен нулю, когда я запускаю свой сервис, обычнозаселено во время базового конструктора.Я использовал .NET Reflector, чтобы увидеть, что делает XmlWriterTraceListener.Есть внутренний метод EnsureWriter ().Этот метод должен создать Writer.Я клонировал метод Microsoft и добавил его в свой Слушатель, и все вроде бы нормально.Мой слушатель подходит для услуги.

 internal bool EnsureWriter()
    {
        bool flag = true;
        if (Writer == null)
        {
            flag = false;
            if (baseFileName == null)
            {
                return flag;
            }
            Encoding encodingWithFallback = new UTF8Encoding(false);
            string fullPath = Path.GetFullPath(baseFileName);
            string directoryName = Path.GetDirectoryName(fullPath);
            string fileName = Path.GetFileName(fullPath);
            for (int i = 0; i < 2; i++)
            {
                try
                {
                    Writer = new StreamWriter(fullPath, true, encodingWithFallback, 0x1000);
                    flag = true;
                    break;
                }
                catch (IOException)
                {
                    fileName = Guid.NewGuid().ToString() + fileName;
                    fullPath = Path.Combine(directoryName, fileName);
                }
                catch (UnauthorizedAccessException)
                {
                    break;
                }
                catch (Exception)
                {
                    break;
                }
            }
            if (!flag)
            {
                baseFileName = null;
            }
        }
        return flag;
    }
...