Domanda

Ho un servizio di Windows e utilizzare nlog per la registrazione. Tutto funziona bene quando ho eseguito dallo studio IDE di Visual. Gli aggiornamenti dei file di log senza problemi. Quando si installa il servizio, il servizio funziona bene, ma il file di log non aggiorna mai. Sono in esecuzione sotto SERVIZIO LOCALE se questo aiuta. Sì, ho creato la directory logs sotto la mia cartella dell'applicazione.

 <?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>
È stato utile?

Soluzione

Il tuo account servizio locale non ha accesso a scrivere nel percorso di file specificato. Si imposta in modo da utilizzare un account di sistema nel "Log On" scheda della finestra di dialogo proprietà del servizio, o è possibile impostare l'account utente come parte del processo di installazione.

Altri suggerimenti

Ho avuto questo problema anche. Come già detto da Genki probabilmente si sta accedendo nella directory \ Windows \ System32. Forse controllare il file di log vi aspettate lì prima. 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);

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

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

È possibile utilizzare Process Monitor per guardare le 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.

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

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

In sostanza, ti consigliamo di includere $ {} basedir come parte della vostra posizione del file nella vostra configurazione. Questo renderà NLog inizio dove l'eseguibile è in esecuzione da.

Hai provato a installare / eseguire il servizio come un altro utente chiamato.

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.

Proprio per curiosità, avete controllato se qualcosa è stato scritto nella directory system32 dell'installazione di Windows? IIRC, che è la directory di base di runtime applicazione predefinita per i servizi ...

Ho appena avuto lo stesso problema con Enterprise registrazione quadro.

Per concludere questa domanda di cui le risposte insieme raccontano la storia giusta.

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 viene scritto.

Il servizio di Windows non dispone di queste autorizzazioni stessi in modo che il file di log non verrà scritta. Windows Service ha permesso (Ho testato questo) per scrivere la

AppDomain.CurrentDomain.BaseDirectory

using System.IO namespace.

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

E 'forse il vostro servizio è in esecuzione in un altro contesto utente e anche a causa delle limitazioni di Windows. Ho avuto lo stesso problema e risolto accedendo al seguente cartella:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

Forse questo ti aiuterà.

Dopo la creazione di un progetto di installazione per il mio servizio, e l'installazione più volte, ho finalmente capito che non avevo inserito il file NLog.config come uno dei file da installare. Ora che è incluso a fianco l'eseguibile, che sta funzionando perfettamente.

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

Ho avuto un problema molto strettamente correlati. Il mio NLog si presentava così:

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

E 'stato tutto il permesso correlati. In primo luogo, in cui ho installato il servizio, ho dovuto assicurarsi che l'account Servizio locale aveva il permesso di leggere / scrivere il Logs cartella.

In secondo luogo, l'internalLogFile anche se non scritto, NLog sembra per cercare di accesso a prescindere - che è il motivo per cui ho risolto il mio problema garantendo ancora una volta SERVIZIO LOCALE ha il permesso di lettura / scrittura in c **: \ temp **

Ciao questo è quello che ho fatto ed è lavoro ben u avere 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 devono fare in modo OnStart:

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

speranza che questo sarà disponibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top