Perché il mio servizio Windows non scrive sul mio file di registro?

Ho un servizio Windows e uso nlog per la registrazione. Tutto funziona bene quando corro dall’idea dello studio visivo. Il file di registro si aggiorna senza problemi. Quando installo il servizio, il servizio funziona correttamente ma il file di registro non si aggiorna mai. Sono in esecuzione in LOCAL SERVICE se questo aiuta. Sì, ho creato la directory dei registri sotto la mia cartella dell’applicazione.

         

L’account del servizio locale non ha accesso alla scrittura nel percorso del file specificato. Puoi impostarlo per utilizzare un account di sistema nella scheda “Accedi” della finestra di dialogo delle proprietà del servizio, oppure puoi impostare l’account utente come parte del processo di configurazione.

Ho avuto anche questo problema. Come menzionato da genki probabilmente stai entrando nella directory \ Windows \ System32. Forse controlla prima il file di log che ti aspetti. Durante la scrittura di servizi ho spesso inserito una riga come questa all’inizio per far sì che la directory corrente si comporti come una normale applicazione

 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 

Se si utilizza la versione x64 di Windows, il file di registro viene salvato nella cartella C: \ Windows \ SysWOW64

Questo è il caso predefinito se si crea il progetto utilizzando la configurazione AnyCPU e la distribuzione in un sistema operativo a 64 bit.

È ansible utilizzare Process Monitor per esaminare le operazioni sui file eseguite e perché non funzionano.

Sospetto (insieme ad altri risponditori) che si tratti di un problema di authorization, con l’account del servizio che non ha accesso sufficiente al file.

Ho trovato questo post molto utile quando ho avuto lo stesso problema:

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

Fondamentalmente, ti consigliamo di includere $ {basedir} come parte della posizione del file nella tua configurazione. Questo farà sì che NLog inizi da dove viene eseguito il tuo eseguibile.

Hai provato a installare / eseguire il tuo servizio come utente con nome diverso.

Se funziona, puoi essere abbastanza sicuro di avere un problema di autorizzazioni in cui il tuo account di sistema locale non ha il permesso di scrivere nella directory / file.

Solo per curiosità, hai controllato se qualcosa è stato scritto nella directory system32 dell’installazione di Windows? Iirc, questa è la directory base di runtime dell’applicazione predefinita per i servizi …

Ho appena avuto lo stesso problema con la registrazione del framework Enterprise.

Per concludere questa domanda di cui le Risposte insieme raccontano la storia corretta.

Nell’esempio in cui si utilizza l’IDE di Visual Studio, il file di registro viene scritto utilizzando le autorizzazioni utente dell’applicazione e il file di registro viene scritto.

Il servizio di Windows non ha le stesse autorizzazioni in modo che il file di registro non venga scritto. Il servizio Windows dispone dell’authorization (l’ho provato) per scrivere su

 AppDomain.CurrentDomain.BaseDirectory 

utilizzando lo spazio dei nomi System.IO.

Quindi indirizza il file di registro in questa directory di base e sarai al sicuro.

Forse il tuo servizio è in esecuzione in un altro contesto utente e anche a causa di restrizioni di Windows. Ho avuto lo stesso problema e ho risolto l’accesso alla seguente cartella:

 Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

Forse questo ti aiuterà.

Dopo aver creato un progetto di installazione per il mio servizio e averlo installato più volte, ho finalmente capito che non avevo incluso il file NLog.config come uno dei file da installare. Ora che è incluso insieme all’eseguibile, funziona perfettamente.

Per quello che vale, il file NLog.config può essere aggiunto manualmente dopo il fatto, ma potrebbe essere necessario arrestare e riavviare il servizio.

Ho avuto un problema molto strettamente correlato. Il mio NLOG sembrava questo:

          

Era tutto legato al permesso. In primo luogo, dove ho installato il servizio, dovevo assicurarmi che l’account SERVICE LOCALE avesse il permesso di leggere / scrivere nella cartella Logs .

In secondo luogo, il file di log interno anche se non scritto, Nlog sembra provare e accedere a prescindere – motivo per cui ho risolto il problema assicurandomi di nuovo che il SERVIZIO LOCALE abbia il permesso di leggere / scrivere in ** c: \ temp **

ciao questo è quello che ho fatto e funziona bene, devi creare una libreria di classi e in questa class aggiungere il seguente metodo ^^

  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 { } } 

e nel tuo servizio devi fare il metodo OnStart:

 Library.WriteErrorLog(" Service Started "); //and in your OnStop method Library.WriteErrorLog(" Service Stoped "); 

spero che questo sarà utile.