2016-04-26 13 views
0

Um Daten für ein paar Produkte zu verschieben, habe ich eine C# -Konsolenanwendung erstellt, die Log4Net verwendet, um den Fortschritt zu verfolgen. Log4Net wird in der App.Config-Datei der Konsolen-App konfiguriert und verfügt derzeit über zwei Appender, einen ConsoleAppender und einen RollingLogFileAppender.Windows-Dienst läuft mit Log4Net

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="logs\Log.txt" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %-5level %logger %method - %message%newline%exception" /> 
    </layout> 
</appender> 
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %-5level %logger %method - %message%newline%exception" /> 
    </layout> 
</appender> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
    <appender-ref ref="ConsoleAppender" /> 
</root> 

Diese Anwendung und ihre Protokollierung funktionieren, wenn sie eigenständig ausgeführt werden. Jetzt, um die Ausführung dieser Konsolen-App zu automatisieren, erstelle ich Windows-Dienst, um die Konsolen-App auszuführen. Die Anwendung erfordert keine Benutzereingaben, daher habe ich Probleme beim Ausführen des Dienstes vorhergesagt. Wenn der Dienst erfolgreich ausgeführt wird, ruft er die Konsolenanwendung auf, und ich kann die Ergebnisse seiner Arbeit sehen, aber die Protokollierung scheint nicht zu funktionieren. Die Protokolle am Speicherort der ausführbaren Datei ändern sich nicht und ich kann keine andere Instanz des Protokolls an anderer Stelle auf meinem Computer finden. Der Dienst wird als LocalSystem ausgeführt, sodass Berechtigungen kein Problem darstellen sollten. Ich habe versucht, die Anwendung mit den folgenden Einstellungen Aufruf:

ProcessStartInfo processStartInfo = new ProcessStartInfo(@"C:\Constellation\Dev\Caelum\Caelum\bin\Debug\Caelum.exe"); 
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
processStartInfo.CreateNoWindow = true; 
processStartInfo.UseShellExecute = false; 
processStartInfo.RedirectStandardError = true; 
processStartInfo.RedirectStandardInput = true; 
processStartInfo.RedirectStandardOutput = true; 

Ich habe versucht, sowohl mit als auch ohne die Ausgabe Umleitungen und weder gearbeitet. Irgendwelche Vorschläge werden sehr geschätzt.

+0

Wie haben Sie die Konfiguration eingerichtet? Ist es in der App.config oder einer separaten Datei? –

+0

Hat das Konto, unter dem der Dienst ausgeführt wird, Schreibberechtigungen für den Speicherort der Protokolle? – wimh

+0

@RB. Die Log4Net-Konfiguration befindet sich in der App.Config-Datei. –

Antwort

3

Ihre ausführbare Datei wird möglicherweise nicht an genau der Stelle ausgeführt, an der Sie sie abgelegt haben. Ich hatte bereits meine Anwendung irgendwo im Ordner System32 ausgeführt.

Versuchen Sie, einen absoluten Pfad anstelle eines relativen Pfades zur Protokolldatei anzugeben, um zu sehen, ob das Ihr Problem behebt.

Siehe here für ein ähnliches Problem.

+0

Ich habe in letzter Zeit nicht überprüft, aber Windows/System32 verwendet immer den aktuellen Standardordner für einen Service-Prozess, ja, fügen Sie den vollständigen Pfad zur Protokolldatei. –

+0

Ich habe den Pfad der Protokolldatei in den absoluten Pfad geändert und das 'Directory.SetCurrentDirectory' hinzugefügt. Log4Net protokolliert jetzt korrekt. Nur den Pfad zum absoluten Pfad zu ändern, funktionierte nicht. Vielen Dank! –

0

Möglicherweise möchten Sie Folgendes überprüfen, um zu überprüfen, ob App.config vom Windows-Dienst gelesen wird. https://stackoverflow.com/a/14074843/6256551

Der relevante Teil der Antwort ist hier:

„Wenn Sie keine entsprechende .exe.config Datei finden kann, dann ist es möglich, dass der Code innerhalb des Dienstes auf die Standardwerte fällt zurück in diesem. Fall, Sie können eine ordnungsgemäß benannte und formatierte Konfigurationsdatei neben der ausführbaren Datei des Dienstes platzieren und dann den Dienst neu starten und alles sollte in Ordnung sein. "