Подтвердить что ты не робот

Почему моя служба Windows не будет записывать в мой файл журнала?

У меня есть служба Windows и я использую nlog для ведения журнала. Все работает отлично, когда я бегу от визуальной студии. Обновления файла журнала без проблем. Когда я устанавливаю службу, служба работает нормально, но файл журнала никогда не обновляется. Если это помогает, я бегу под ЛОКАЛЬНЫМ ОБСЛУЖИВАНИЕМ. Да, я создал каталог журналов в папке моего приложения.

 <?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>
4b9b3361

Ответ 1

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

Ответ 2

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

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

У меня была одна и та же проблема с журналом Enterprise framework.

В заключение этого вопроса, о котором ответы вместе сообщают правильную историю.

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

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

AppDomain.CurrentDomain.BaseDirectory

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

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

Ответ 9

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

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

Возможно, это поможет вам.

Ответ 10

После создания проекта установки для моей службы и установки его несколько раз я наконец понял, что я не включил файл NLog.config в качестве одного из файлов для установки. Теперь, когда он включен вместе с исполняемым файлом, он работает отлично.

Для того, что стоит, файл NLog.config можно добавить вручную после факта, но может потребоваться остановить и перезапустить службу.

Ответ 11

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

  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 ");

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