Domanda

C'è un elenco di informazioni contestuali (cioè $ {} longdate, $ {level}, {$ messaggio}) in linea? Voglio impostare il file di log in una cartella AppData \ Local dell'utente. E 'forse $ {} appdatalocal? E come avrei accedere al file da inviare come allegato e-mail forse come
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")?

È stato utile?

Soluzione

link per un elenco di LayoutRenderers supportati da NLog. Si noti che alcuni di questi rendering del layout sono stati aggiunti a NLog 2.0 (che è stato appena rilasciato in versione beta a settembre). Ci sono alcuni LayoutRenderers che consentono di specificare le cartelle "speciali" (come Documenti, Musica, ecc). C'è anche un LayoutRenderer che può recuperare tha valore di una variabile d'ambiente. È possibile utilizzare LayoutRenderers per definire il nome del file:

${basedir}/${shortdate}.log

o

${environment:variable=TEMP}/${processname}.log

Per quanto riguarda l'accesso al nome del file risultante a livello di codice, non sono sicuro di come fare, anche se ho un'idea ...

Si potrebbe configurare un MethodCallTarget (consultare la documentazione al link qui sopra - o, meglio ancora, consultare il file di aiuto NLog) con lo stesso layout del layout si usa per definire il nome del file. Definire una singola regola logger nel file NLog.config (o app.config se si configura in linea) che registra a tale obiettivo. Scrivere il metodo statico, LogMethod, che verrà chiamato dal MethodCallTarget. Scrivere un altro metodo statico, GetFilename, sulla stessa classe che restituisce una stringa. GetFilename registra semplicemente un messaggio utilizzando il logger che è configurato per scrivere al MethodCallTarget. NLog chiama LogMethod. All'interno di LogMethod si riceverà il messaggio completamente formattato. Dal momento che si è configurato il layout, per avere lo stesso nome del file del layout (cioè solo i parametri necessari per calcolare il nome del file), il valore del messaggio che viene registrato dovrebbe essere il percorso del file. Dal momento che LogMethod deve essere un metodo statico (requisito NLog), non hai molta scelta in cui è memorizzato il "nome del file". Ho appena messo in una variabile stringa statica.

Qualcosa di simile (sulla base di campioni presenti nel file di aiuto NLog sotto MethodCallTarget):

public class Example
{
  private static filename;

  //
  // This is the method that NLog will call when you log with the logger that is configured
  // to write to the MethodCallTarget
  //
  public static void LogMethod(string level, string message)
  {
    filename = message;
  }

  public static string GetLogFile()
  {
    Logger logger = LogManager.GetLogger("filenamelogger");
    filenamelogger.Info("logging a message just to get the result");
    return filename;
  }
}

Configura qualcosa di simile:

  <variable fn="${basedir}/${processname}.log" />
  <targets> 
    <target name="m" xsi:type="MethodCall" className="Example, MethodCall" 
            methodName="LogMethod"> 
      <parameter layout=${fn} /> 
    </target> 
    <target name="f" xsi:type="File"
            layout="${longdate} ${loggername} ${level} ${message}" 
            fileName="${fn}">
    </target>
  </targets> 
  <rules> 
    <logger name="filenamelogger" minlevel="Debug" writeTo="m" final="true" /> 
    <logger name="*" minlevel="Debug" writeTo="f" />
  </rules> 

Ovviamente questo non è thread-safe, ma mostra un modo per ottenere il risultato di un layout.

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