Почему моя служба 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>
Ответы
Ответ 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 ");
надеюсь, что это будет полезно.