2011-09-13 14 views
5

Sto eseguendo la registrazione nella mia applicazione via NLog. Sto cercando di raccogliere alcuni registri per diagnosticare un problema strano che sto avendo su una sola macchina. Nel mio NLog.Config ho la seguente configurazione:NLog non sembra accedere nell'ambiente ClickOnce ma funziona in dev

<?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="logfile" xsi:type="File" fileName="${specialfolder:dir=PollingLogs:file=log.txt:folder=MyDocuments}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="logfile" /> 
    </rules> 
</nlog> 

Quando eseguo sulla mia macchina di sviluppo sto ottenendo un file log.txt creato nella mia cartella documenti, con tutta la registrazione avviene in modo corretto. Tuttavia, quando distribuisco l'applicazione con ClickOnce, tuttavia, non viene creato alcun file log.txt (che posso trovare almeno). Non si verificano errori e la mia app funziona normalmente, ma non succede nulla.

Sono perplesso su come eseguire il debug di questo problema. Qualcuno ha qualche idea che possono condividere per aiutarmi a far funzionare correttamente NLog in un ambiente clickonce?

Come riferimento, il riferimento NLog nel mio progetto è impostato per copiare locale.

+0

Scrivo sempre nel registro quando viene avviata un'app e ne viene eseguito il fail completo se la registrazione non riesce. In questo modo, so quando installo l'app, sia sul Web che sul desktop, che la registrazione funziona e ci sarà quando ne avrò bisogno. – DOK

+0

Come si rileva se NLog ha avuto successo o no? – KallDrexx

+0

Si potrebbe provare l'aggiunta di [internalLogFile = "nlog-errors.log"] (http://nlog-project.org/wiki/Internal_logging) per il file di configurazione nlog, e poi se nlog si ottiene un'eccezione quando si cerca di accedere esso registrerà l'errore di registrazione nel file di registro – BrandonAGr

risposta

2

Per eseguire il debug di questo uso Sysinternal ProcessMon (gratuito). esso è possibile mostrare tra le altre cose i file accessi cercato/fatte di un processo ...

Per questo tipo di Log mi consiglia di utilizzare ApplicationData o CommonApplicationData o LocalApplicationData da Environment.SpecialFolder e non MyDocuments ...

+2

ProcMon sarebbe valido, è possibile verificare che l'app stia leggendo il file di configurazione nlog che si prevede che sia il primo. Forse il file di configurazione nlog non è stato distribuito con l'app clickonce? – BrandonAGr

0

Ho riscontrato questo problema con un progetto a cui stavo lavorando oggi.

Il file NLog.config è sempre copiati sul directory di compilazione così va bene quando lo si esegue da lì, ma i programmi di installazione ClickOnce sono non distribuire il file NLog.config quando viene installato il software.

Questo spiega il comportamento che si sta verificando: quando viene eseguito dalla copia installata, non ha alcuna configurazione di registrazione.

L'unica soluzione che ho trovato finora è di unire la configurazione di registrazione nel file app.config, perché il file exe.config viene distribuito da ClickOnce - Non ho avuto molta gioia nel tentativo di aggiungere il file NLog.config all'installatore.

4

So che è leggermente in ritardo, ma c'è un'altra soluzione qui descritta: Configure log4net or NLog with XML from code sebbene risponda a un'altra domanda.

Ho avuto lo stesso problema descritto da KallDrexx. Io non sono felice con più file di configurazione NLog galleggiano circa (più progetti nella stessa soluzione) così creato una classe NLogHelper che ha un metodo di tornare alla configurazione:

public static XmlLoggingConfiguration SetNlogConfiguration() 
    { 
     var sr = new StringReader(NlogXmlConfigString1()); 
     var xr = XmlReader.Create(sr); 
     var config = new XmlLoggingConfiguration(xr, null); 
     return config; 
    } 

un metodo separato solo restituisce la stringa xml, in il mio caso:

private static string NlogXmlConfigString1() 
    { 
     return @"<nlog xmlns='http://www.nlog-project.org/schemas/NLog.xsd\' 
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance\'> 
        <targets> 
         <target name='logfile' xsi:type='File' fileName='${specialfolder:file=My_Logger.txt:folder=Desktop}' /> 
        </targets> 

        <rules> 
        <logger name='*' minlevel='Info' writeTo='logfile' /> 
        </rules> 
       </nlog>"; 
    } 

Infine, è sufficiente impostare la configurazione nel relativo costruttore della classe:

NLog.LogManager.Configuration = NlogHelper.Helper.SetNlogConfiguration(); 

Ovviamente può essere riscritta e oggetti come l il nome del file og può essere passato come parametri, se necessario. La configurazione xml può essere sostituita con qualunque sia la tua configurazione. Sembra inoltre offrire la possibilità di specificare facilmente più configurazioni selezionate in fase di esecuzione.

Mi piace perché trovo che mi dà un maggiore controllo sulla configurazione di NLog nel codice e durante l'implementazione.

5

ho trovato la risposta a questo problema quando il NLog.config non sarebbero copiati al vostro programma se installato utilizzando ClickOnce.

è necessario selezionare il file NLog.config nel vostro Project utilizzando Solution Explorer e impostare il Properties come segue:

Operazione di generazione: Content

Copia nella directory di output: Copia sempre

Ora quando si distribuisce usando ClickOnce i file devono essere copiati anche! :)