web-dev-qa-db-ger.com

Warum schreibt mein Windows-Dienst nicht in meine Protokolldatei?

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>
24
Mike Roosa

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.

9
Michael Meadows

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);
29
Tim Clem

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.

11

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.

2
Richard

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.

2
bressain

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. 

1
peterincumbria

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.

1
genki

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. 

1
Eoin Campbell

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.

0
jwatts1980

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.

0
Aykut Çevik

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. 

0
Simon Miller