2011-10-28 11 views
12

Sto eseguendo il codice su un microcontrollore con .NET Micro Framework e voglio che il mio output di debug scriva su un file di testo. Come funziona?Scrittura dell'output di debug C# in file .txt

+0

vi consiglio di appena reindirizzare l'output in un file (ad esempio your_app> log.txt). È più flessibile – m0skit0

+1

Se stiamo parlando flessibile, direi usare NLog. Solo, non ho idea di come o in che modo avrebbe funzionato su un sistema vincolato ... @ m0skit0: C'è una shell con cui fare il reindirizzamento quando si usa .Net MF? –

+0

nlog è buono anche log4net [Modifica] oops non è sicuro che quelle siano opzioni su .NET Micro ... – kenny

risposta

1

Si dovrà fare qualcosa di simile:

// Set up listener 
string filename = @"C:\listener.txt"; 
FileStream traceLog = new FileStream(filename, FileMode.OpenOrCreate); 
TextWriterTraceListener listener = new TextWriterTraceListener(traceLog); 

// Output to listener 
listener.WriteLine("Trace message here"); 

// Flush any open output before termination. 
// Maybe in an override of Form.OnClosed. 
listener.Flush(); 

Tratto da here.

Another related question

21

Usa Trace. È progettato per fare ciò di cui hai bisogno.

using System; 
using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     Trace.Listeners.Add(new TextWriterTraceListener("yourlog.log")); 
     Trace.AutoFlush = true; 
     Trace.Indent(); 
     Trace.WriteLine("Entering Main"); 
     Console.WriteLine("Hello World."); 
     Trace.WriteLine("Exiting Main"); 
     Trace.Unindent(); 
     Trace.Flush(); 
    } 
} 
+2

Se vuoi solo rintracciare su Console, allora ConsoleTraceListener sembra essere una soluzione più chiara e diretta. Ma ha chiesto di scrivere in un file. – Ucodia

+0

Ho appena aggiornato la mia risposta, grazie per indicarmi il problema. :) – Ekk

11

La soluzione più flessibile per utilizzare un tracciato out-of-the-box è quello di rendere la configurazione di un'applicazione che definirà ascoltatori di traccia.

<configuration> 
    <system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
     <add name="textListener" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="trace.log" /> 
     <remove name="Default" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
</configuration> 

Poi, nella vostra applicazione, ogni volta che si desidera registrare qualcosa, basta fare:

Trace.WriteLine("Hello, this is a trace"); 

Ma il potere della classe TraceListener risiede nella sua granularità. È possibile scegliere tra i livelli Errore, Info e Avviso e definire un file di registro diverso per qualsiasi livello sia necessario tracciare. L'utilizzo dei file di configurazione rende inoltre più semplice disabilitare la traccia nell'applicazione perché non è necessario ricompilare l'applicazione.

Per ulteriori informazioni sul sistema di tracciamento, controllare questo MSDN article.

+0

+1 Penso che tu risponda alla mia risposta/domanda che la soluzione dovrebbe funzionare in .NET Micro Framework. Sto ancora usando debugview.exe. – JPBlanc

7

Ekk ha ragione a proposito del fatto che Trace è un design migliore, tuttavia non risponde alla domanda, che andrebbe bene in assenza di una soluzione diretta. L'OP o qualcuno potrebbe aver ereditato una base di codice che utilizza Debug in tutto e Trace potrebbe non essere desiderabile al momento.

ho trovato questa soluzione [http://bytes.com/topic/c-sharp/answers/273066-redirect-output-debug-writeline]:

TextWriterTraceListener[] listeners = new TextWriterTraceListener[] { 
new TextWriterTraceListener("C:\\debug.txt"), 
new TextWriterTraceListener(Console.Out) 
}; 

Debug.Listeners.AddRange(listeners); 

Debug.WriteLine("Some Value", "Some Category"); 
Debug.WriteLine("Some Other Value"); 
+0

Questo arriverà e rilascerà il file automaticamente e tutto quel jazz? – Sinaesthetic

+0

Credo che l'autoflush possa essere configurato nel file .config - '' - vedi http://stackoverflow.com/questions/4345952/textwritertracelistener-does-not-work. Potrebbe anche esserci una 'proprietà AutoFlush 'statica nella classe' System.Diagnostics.Trace'. Personalmente non mi preoccuperei dell'autoflushing. Normalmente la tracciatura gestisce un sacco di dati, e quindi per il buffering delle prestazioni è altamente raccomandato. Se ti concentri sul debug di un'area problematica, potresti provare a mantenere un riferimento statico a 'ascoltatori' e a chiamare' .Flush() 'sulle linee rilevanti. – Todd

+0

Semplice e veloce, come suggerito, non tutti i modi possono controllare la fonte da sviluppare :) Detto questo, questa soluzione fa scattare una stampa a doppia uscita all'interno di Visual Studio.Ma grazie comunque – bonitzenator