2009-07-26 13 views

risposta

6

Windows utilizza il registro eventi per tracciare l'attività. È possibile utilizzare la classe System.Diagnostics.Trace:

var traceSwitch = new TraceSwitch("MySwitch", ""); 
var exception = new Exception("Exception message"); 

if (traceSwitch.TraceError) 
{ 
    Trace.TraceError(exception); 
} 

Ed è possibile utilizzare app.config per istruire il logger in cui scrivere:

<system.diagnostics> 
    <switches> 
     <add name="MySwitch" value="Verbose" /> 
    </switches> 
    <trace autoflush="true"> 
     <listeners> 
      <add name="EventLogger" 
       type="System.Diagnostics.EventLogTraceListener" 
       initializeData="NameOfYourApplication" /> 
     </listeners> 
    </trace> 
</system.diagnostics> 
10

Si può anche considerare l'utilizzo della Enterprise Library. Sembra complicato iniziare, ma una o due ore di gioco pagherà. Config è memorizzato in app.config in modo che tu possa cambiarlo senza ricompilare - questo può essere davvero utile quando hai lo stesso codice seduto su server di test e live con configurazione diversa. Puoi fare molto senza un sacco di codice.

Una cosa bella è che è possibile definire criteri di eccezione in modo che le eccezioni vengano registrate automaticamente. Ecco alcuni codice che potrebbe utilizzare (sto usando EntLib 4.1):

try 
    { 
     //This would be where your exception might be thrown. I'm doing it on 
     //purpose so you can see it work 
     throw new ArgumentNullException("param1"); 
    } 
    catch (Exception ex) 
    { 
     if (ExceptionPolicy.HandleException(ex, "ExPol1")) throw; 
    } 

La linea nel blocco catch sarà rigenerare l'eccezione SE l'ExPol1 definisce. Se ExPol1 è configurato per il rethrow, ExceptionPolicy.HandleException restituirà true. In caso contrario, restituisce false.

Si definisce il resto in config. L'XML sembra piuttosto orribile (non lo è sempre) ma lo si crea usando l'editor di configurazione della libreria aziendale. Lo sto solo fornendo per completezza.

Nella sezione loggingConfiguration, questo file definisce

  • registro: un file di log di testo rotolamento (è possibile utilizzare il costruito nel log di eventi di Windows, tabelle SQL, e-mail, MSMQ e altri), con
  • un formattatore di testo che governa come i parametri vengono scritti nel registro (a volte devo configurare questo per scrivere tutto a una riga, altre volte sparsi in molti),
  • una singola categoria "Generale"
  • una fonte speciale che le trappole eventuali errori nel config/entlib e pronti contro termine li anche loro. Ti consiglio vivamente di farlo.

Nella sezione ExceptionHandling, esso definisce

  • un'unica politica: "ExPo1", che gestisce digitare ArgumentNullExceptions e specifica il postHandlingAction di Nessuno (cioè non rethrow).
  • un gestore che registra alla categoria generale (definito sopra)

io non farlo in questo esempio, ma si può anche sostituire un eccezione con un diverso tipo utilizzando un criterio.

<?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
     <configSections> 
     <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     </configSections> 
     <loggingConfiguration name="Logging Application Block" tracingEnabled="true" 
     defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"> 
     <listeners> 
      <add fileName="rolling.log" footer="" formatter="Text Formatter" 
      header="" rollFileExistsBehavior="Overwrite" rollInterval="None" 
      rollSizeKB="500" timeStampPattern="yyyy-MM-dd" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      name="Rolling Flat File Trace Listener" /> 
     </listeners> 
     <formatters> 
      <add template="Timestamp: {timestamp}; Message: {message}; Category: {category}; Priority: {priority}; EventId: {eventid}; Severity: {severity}; Title:{title}; Machine: {machine}; Application Domain: {appDomain}; Process Id: {processId}; Process Name: {processName}; Win32 Thread Id: {win32ThreadId}; Thread Name: {threadName}; &#xD;&#xA;  Extended Properties: {dictionary({key} - {value})}" 
      type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      name="Text Formatter" /> 
     </formatters> 
     <categorySources> 
      <add switchValue="All" name="General"> 
      <listeners> 
       <add name="Rolling Flat File Trace Listener" /> 
      </listeners> 
      </add> 
     </categorySources> 
     <specialSources> 
      <allEvents switchValue="All" name="All Events" /> 
      <notProcessed switchValue="All" name="Unprocessed Category" /> 
      <errors switchValue="All" name="Logging Errors &amp; Warnings"> 
      <listeners> 
       <add name="Rolling Flat File Trace Listener" /> 
      </listeners> 
      </errors> 
     </specialSources> 
     </loggingConfiguration> 
     <exceptionHandling> 
     <exceptionPolicies> 
      <add name="ExPol1"> 
      <exceptionTypes> 
       <add type="System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       postHandlingAction="None" name="ArgumentNullException"> 
       <exceptionHandlers> 
        <add logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling" 
        formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
        priority="0" useDefaultLogger="false" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
        name="Logging Handler" /> 
       </exceptionHandlers> 
       </add> 
      </exceptionTypes> 
      </add> 
     </exceptionPolicies> 
     </exceptionHandling> 
    </configuration> 
+6

Non è forse un po 'scortese a -1 qualcosa senza spiegare? Che cosa ho fatto di sbagliato? – serialhobbyist

Problemi correlati