Ich habe einen Windows-Dienst und verwende nlog für die Protokollierung. Alles funktioniert gut, wenn ich aus dem visuellen Studio ide renne. Die Protokolldatei wird ohne Probleme aktualisiert. Wenn ich den Dienst installiere, wird der Dienst ordnungsgemäß ausgeführt, die Protokolldatei wird jedoch nie aktualisiert. Ich arbeite unter LOKALER DIENST, wenn das hilft. Ja, ich habe das Protokollverzeichnis unter meinem Anwendungsordner erstellt.
<?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>
Ihr lokales Dienstkonto hat keinen Schreibzugriff auf den angegebenen Speicherort. Sie können für die Verwendung eines Systemkontos auf der Registerkarte "Anmelden" des Service-Eigenschaften-Dialogfelds festlegen oder Sie können das Benutzerkonto als Teil des Installationsvorgangs einrichten.
Ich hatte auch dieses Problem. Wie von genki erwähnt, loggen Sie sich wahrscheinlich im Verzeichnis\Windows\System32 ein. Vielleicht suchen Sie zuerst nach der Protokolldatei, die Sie dort erwarten. Beim Schreiben von Services habe ich oft eine Zeile wie diese am Anfang eingefügt, damit sich das aktuelle Verzeichnis wie eine normale Anwendung verhält
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
Wenn Sie die x64-Version von Windows verwenden, wird die Protokolldatei im Ordner C:\Windows\SysWOW64 gespeichert
Dies ist der Standardfall, wenn Sie Ihr Projekt mit der AnyCPU - Konfiguration erstellen und auf einem 64-Bit-Betriebssystem bereitstellen.
Sie können Process Monitor verwenden, um die durchzuführenden Dateioperationen zu sehen und warum sie fehlschlagen.
Ich vermute (zusammen mit anderen Antwortern), dass dies ein Berechtigungsproblem ist, da das Konto des Dienstes keinen ausreichenden Zugriff auf die Datei hat.
Ich fand diesen Beitrag sehr hilfreich, wenn ich dasselbe Problem hatte:
http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html
Grundsätzlich sollten Sie $ {basedir} als Teil Ihres Dateispeicherorts in Ihre Konfiguration aufnehmen. Dadurch wird NLog dort gestartet, wo die ausführbare Datei ausgeführt wird.
Ich hatte gerade das gleiche Problem mit der Protokollierung des Enterprise Frameworks.
Zum Abschluss dieser Frage erzählen die Antworten zusammen die richtige Geschichte.
In Ihrem Beispiel wird bei Verwendung von Visual Studio IDE die Protokolldatei mit den Benutzerberechtigungen der Anwendung geschrieben und die Protokolldatei wird geschrieben.
Der Windows-Dienst verfügt nicht über dieselben Berechtigungen, sodass die Protokolldatei nicht geschrieben wird. Der Windows-Dienst hat die Erlaubnis (ich habe dies getestet), um in das zu schreiben
AppDomain.CurrentDomain.BaseDirectory
verwenden des System.IO-Namespace.
Richten Sie die Protokolldatei in dieses Basisverzeichnis, und Sie sind sicher.
Haben Sie nur aus Neugier geprüft, ob im system32-Verzeichnis Ihrer Windows-Installation etwas geschrieben wird? Iirc, das ist das Standard-Basisverzeichnis der Anwendung für Services.
Haben Sie versucht, Ihren Dienst unter einem anderen benannten Benutzer zu installieren/auszuführen.
Wenn dies funktioniert, können Sie ziemlich sicher sein, dass Sie ein Berechtigungsproblem haben, bei dem Ihr lokales Systemkonto keine Berechtigung zum Schreiben in das Verzeichnis/die Datei hat.
Nachdem ich ein Installationsprojekt für meinen Dienst erstellt und mehrmals installiert hatte, wurde mir schließlich klar, dass ich die Datei NLog.config nicht als eine der zu installierenden Dateien angegeben hatte. Jetzt, da es neben der ausführbaren Datei enthalten ist, funktioniert es perfekt.
Die NLog.config-Datei kann zwar nachträglich manuell hinzugefügt werden, der Dienst muss jedoch möglicherweise angehalten und neu gestartet werden.
Möglicherweise wird Ihr Dienst unter einem anderen Benutzerkontext und auch aufgrund von Windows-Einschränkungen ausgeführt. Ich hatte das gleiche Problem und löste es, indem ich mich in folgendem Ordner anmeldete:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
Vielleicht hilft dir das.
Ich hatte ein sehr eng verwandtes Problem. Mein NLOG sah so aus:
<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>
Es war alles auf Erlaubnis bezogen. Erstens musste ich bei der Installation des Dienstes sicherstellen, dass das LOCAL SERVICE-Konto die Berechtigung zum Lesen/Schreiben in den Ordner Logs hatte.
Zweitens scheint das interneLogFile nicht in geschrieben zu sein, Nlog scheint trotzdem zu versuchen und zuzugreifen - weshalb ich mein Problem gelöst habe, indem erneut sichergestellt wurde, dass LOCAL SERVICE die Berechtigung zum Lesen/Schreiben in ** c:\temp ** hat.