C # Служба Windows создает файл трассировки, но никогда не записывает в него - PullRequest
2 голосов
/ 08 марта 2011

У меня есть служба Windows, созданная с использованием меню "new ... c # service" в VS 2010. В конструкторе у меня есть:

TextWriterTraceListener tr1 = new TextWriterTraceListener( System.IO.File.CreateText("d:\\output\\test.log"));
Trace.Listeners.Add(tr1);
Trace.WriteLine("Created");

Настройка службы для запуска в учетных записях LocalService или LocalSystem(WinXP) Я получаю файл, созданный при запуске службы, но он всегда пуст.Добавление вызова Flush () к деструктору не помогает.У меня больше вызовов трассировки в методах OnStart / OnStop / OnPause / OnContinue.

(редактировать) У меня включена трассировка и отладка в проекте - выходной файл трассировки равен создается, просто пусто.

Служба извлекает записи из базы данных и записывает файлы на диск для системы обмена сообщениями, с которой нам приходится взаимодействовать.Таким образом, проблема с файлом журнала - это только первый случай более широкой проблемы - мне нужно иметь возможность писать в выбранный пользователем каталог сообщений.

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

  1. Что я делаю неправильно с вызовами трассировки?(почему файл создается, но ничего не записывается в него?)
  2. Если я хочу, чтобы моя служба работала в учетной записи LocalService, есть ли какой-нибудь способ заставить установщик дать ему разрешение на запись в папку / поддерево?
  3. Или я должен запускать службу как LocalSystem?
  4. Является ли эта повторная реализация [Debug.Launch / EnsureWriter] [2] разумным решением?Я более склонен говорить «почему писатель нулевой», чем вставлять код из другого места, как это.

спасибо за любую помощь

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Вы уверены, что для вашего проекта определен символ TRACE? Весь код System.Diagnostics.Trace условно компилируется на основе этого символа. Обратите внимание, что вам все равно нужно будет очистить вывод трассировки, чтобы убедиться, что все строки записаны (или же установить Trace.AutoFlush в true).

В качестве примечания я бы рекомендовал не использовать статические методы Trace и рекомендовать хотя бы использовать System.Diagnostics.TraceSource.

1 голос
/ 08 марта 2011

попробуйте настроить трассировку в app.exe.config приложения.

<configuration>
   <system.diagnostics>
    <sources>
        <source name="System.ServiceModel" 
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
        <listeners>
         <add name="traceListener" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData= "c:\log\Traces.svclog" />
        </listeners>
     </source>
    </sources>
   </system.diagnostics>
</configuration>

Это можно сделать с помощью редактора конфигурации служб в инструментах Microsoft Windows SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...