2009-05-13 7 views
25

Ho un servizio Windows e utilizzo 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.Perché il mio servizio Windows non scrive sul mio file di registro?

<?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> 
+0

si applica a qualsiasi lingua in realtà, non solo C# e .net. Ho avuto questo problema per il mio servizio di windows C++. –

+0

Controllare sempre il [registro interno] (https://github.com/NLog/NLog/wiki/Internal-Logging) per questo tipo di problemi. – Julian

risposta

10

L'account di servizio locale non ha accesso alla scrittura nel percorso 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.

+2

o semplicemente concedere l'autorizzazione del servizio locale per scrivere in quella directory nel programma di installazione. –

+2

come si autorizza l'installazione? anche il nlog.config si trova nella directory bin del progetto ma non viene spostato nel file di installazione. come posso farlo accadere –

2

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

Se funziona, allora si può essere abbastanza sicuro che hai un problema di autorizzazioni in cui il vostro account di sistema locale non ha il permesso di scrivere il file/directory.

3

È possibile utilizzare Process Monitor di guardare ai operazioni sui file in corso di esecuzione, e perché stanno fallendo.

ho il sospetto (insieme ad altri answerers) che questo è un problema di permessi, con l'account del servizio non hanno sufficiente accesso al file.

+1

grazie per il suggerimento richard, questo mi ha fatto capire che il file nlog.config non c'era. caricato e ancora non funziona ma sono sicuro che è parte del problema –

2

Appena fuori dalla curiosità, hai controllato se qualcosa è stato scritto nella directory system32 dell'installazione di Windows? Iirc, questa è la directory di base dell'applicazione di base predefinita per i servizi ...

30

Ho riscontrato 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 spesso mi sono messo una linea come questa in origine, per ottenere la directory corrente a comportarsi come una normale applicazione

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
+1

non sembra che sia in system32 –

+0

non è nel sistema 32, è in SysWOW64 – julestruong

11

Se si utilizza la versione x64 di Windows rispetto del file di registro viene salvato in C: \ Windows \ cartella SysWOW64

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

2

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.

Nel tuo esempio quando si utilizza l'IDE di Visual Studio il file di log vengono scritti usando le autorizzazioni degli utenti dell'applicazione e il file di registro è stato scritto.

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

AppDomain.CurrentDomain.BaseDirectory 

utilizzando lo spazio dei nomi System.IO.

Quindi dirigere il file di registro in questa directory di base e sarete al sicuro.

+0

Questo ha funzionato perfettamente con il mio servizio di Windows. Grazie! – Baxter

1

Forse il 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à.

1

Dopo aver creato un progetto di installazione per il mio servizio e averlo installato più volte, ho finalmente realizzato 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.

-2

hi questo è quello che ho fatto ed è lavoro ben u have per creare libreria di classi e in questa classe aggiungere il seguente Methode ^^

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 vostro servizio u deve fare in modo OnStart:

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

sperare che questo sia utile.

+0

Mentre questo è * un * metodo di registrazione, è difficilmente un buon sostituto per un framework di registrazione adeguato come nlog, che l'OP sta usando e chiedendo. – mutex