Почему моя служба Windows не записывает в мой файл журнала? - PullRequest
24 голосов
/ 13 мая 2009

У меня есть служба Windows, и я использую nlog для регистрации. Все работает нормально, когда я бегу из Visual Studio Ide. Файл журнала обновляется без проблем. Когда я устанавливаю службу, служба работает нормально, но файл журнала никогда не обновляется. Я работаю под локальной службой, если это помогает. Да, я создал каталог журналов в папке своего приложения.

 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

  <targets>
    <target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}_info.txt"
            layout="${date} ${logger} ${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" maxlevel="Info" writeTo="file" />
  </rules>
</nlog>

Ответы [ 12 ]

28 голосов
/ 13 мая 2009

У меня тоже была эта проблема. Как упоминает genki, вы, вероятно, входите в каталог \ Windows \ System32. Может быть, сначала проверьте файл журнала, который вы ожидаете. Когда я пишу сервисы, я часто в начале ставлю такую ​​строку, чтобы текущий каталог вел себя как обычное приложение

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
12 голосов
/ 09 апреля 2011

Если вы используете 64-разрядную версию Windows, файл журнала сохраняется в папке C: \ Windows \ SysWOW64

Это случай по умолчанию, если вы строите свой проект с использованием конфигурации AnyCPU и развертываете его в 64-битной операционной системе.

9 голосов
/ 13 мая 2009

Ваша локальная учетная запись службы не имеет доступа для записи в указанное местоположение файла. Вы можете использовать системную учетную запись на вкладке «Вход» диалогового окна свойств службы или настроить учетную запись пользователя как часть процесса установки.

2 голосов
/ 12 февраля 2013

Я нашел этот пост очень полезным, когда у меня была такая же проблема:

http://nlog -forum.1685105.n2.nabble.com / Nlog-не-рабочий-с Windows-сервис-tp6711077p6825698.html

По сути, вы захотите включить $ {basedir} как часть расположения вашего файла в вашей конфигурации. Это заставит NLog начать с того места, откуда запускается ваш исполняемый файл.

2 голосов
/ 13 мая 2009

Вы можете использовать Process Monitor для просмотра выполняемых файловых операций и причин их сбоя.

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

1 голос
/ 25 мая 2012

У меня только что была такая же проблема с ведением журнала Enterprise Framework.

Чтобы завершить этот вопрос, ответы на который вместе рассказывают правильную историю.

В вашем примере при использовании IDE Visual Studio файл журнала записывается с использованием разрешений пользователя приложения и файл журнала записывается.

Служба Windows не имеет таких же разрешений, поэтому файл журнала не будет записан. Служба Windows действительно имеет разрешение (я проверял это) для записи в

AppDomain.CurrentDomain.BaseDirectory

с использованием пространства имен System.IO.

Так что направьте файл журнала в этот базовый каталог, и вы будете в безопасности.

1 голос
/ 13 мая 2009

Просто из любопытства вы проверили, пишется ли что-нибудь в каталоге system32 вашей установки Windows? Iirc, это базовый каталог приложений по умолчанию для служб ...

1 голос
/ 13 мая 2009

Вы пытались установить / запустить свой сервис от имени другого пользователя.

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

0 голосов
/ 09 мая 2018

У меня была очень тесно связанная проблема. Мой NLOG выглядел так:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  autoReload="true"
  throwExceptions="false"
  internalLogLevel="Off"
  internalLogFile="c:\temp\nlog-internal.log">

<targets>
<!-- Write events to a file with the date in the filename -->
<target xsi:type="File"
  name="File"
  fileName="${basedir}/logs/${shortdate}.log"
  layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>

<rules>
<!-- Exception levels: Fatal, Error, Warn, Info, Debug, Trace -->
<logger name="*"
  minlevel="Debug"
  writeTo="File" />
</rules>

Все это было связано с разрешением. Во-первых, когда я установил службу, мне нужно было убедиться, что у учетной записи LOCAL SERVICE есть разрешение на чтение / запись в папку Logs .

Во-вторых, несмотря на то, что internalLogFile не записан, Nlog, по-видимому, пытается получить к нему доступ независимо - поэтому я решил проблему, снова убедившись, что LOCAL SERVICE имеет разрешение на чтение / запись в ** c: \ temp **

0 голосов
/ 04 марта 2016

привет, это то, что я сделал, и это прекрасно работает, вам нужно создать библиотеку классов и в этот класс добавить следующий метод ^^

  public static void WriteErrorLog(Exception ex)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
            sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ":" + ex.Message.ToString().Trim());
            sw.Flush();
            sw.Close();
        }
        catch
        {

        }
    }
    public static void WriteErrorLog(String Message)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
            sw.WriteLine(DateTime.Now.ToString() + ":"+Message);
            sw.Flush();
            sw.Close();
        }
        catch
        {

        }
    }

и в вашем сервисе вы должны сделать в OnStart метод:

Library.WriteErrorLog(" Service Started ");
//and in your OnStop method
     Library.WriteErrorLog(" Service Stoped ");

надеюсь, это будет полезно.

...