Domanda

Ho cercato di utilizzare System.Diagnostics.trace per fare la registrazione è un'app molto semplice. Generalmente fa tutto ciò di cui ho bisogno. L'aspetto negativo è che se chiamo

Trace.TraceInformation("Some info");

L'output è "Informazioni SomeApp.exe: 0: alcune informazioni". Inizialmente questo mi ha intrattenuto ma non più. Vorrei semplicemente produrre "alcune informazioni" alla console. Quindi ho pensato che scrivere un tracelistener cusom, piuttosto che usare il consoletracelistener integrato, avrebbe risolto il problema. Riesco a vedere un formato specifico che voglio tutto il testo dopo il secondo colon. Ecco il mio tentativo di vedere se questo funzionerebbe.

class LogTraceListener : TraceListener
{
    public override void Write(string message)
    {
        int firstColon = message.IndexOf(":");
        int secondColon = message.IndexOf(":", firstColon + 1);

        Console.Write(message);
    }

    public override void WriteLine(string message)
    {
        int firstColon = message.IndexOf(":");
        int secondColon = message.IndexOf(":", firstColon + 1);

        Console.WriteLine(message);
    }
}

Se output il valore di Firstcolon è sempre -1. Se metto un punto di pausa, il messaggio è sempre solo "alcune informazioni". Da dove vengono tutte le altre informazioni?

Quindi ho dato un'occhiata allo stack di chiamata nel punto appena prima della console. Writeline è stato chiamato. Il metodo che chiamato My WriteLine Metodo è: System.dll! System.Diagnostics.TraceListener.TraceEvent (System.Diagnostics.TraceEventCache EventCache, String Source, System.Diagnostics.TraceEventType eventType, int ID, String Message) + 0x33 bytes

Quando uso il riflettore per guardare questo messaggio, tutto sembra abbastanza semplice. Non riesco a vedere alcun codice che modifichi il valore della stringa dopo averlo inviato a Console.Writeline. L'unico metodo che potrebbe modificare positivamente il valore della stringa sottostante è una chiamata a non afenativeMethods.eventwriteString che ha un parametro che è un puntatore al messaggio.

Qualcuno capisce cosa sta succedendo qui e se posso cambiare l'output per essere solo il mio messaggio senza la lanugine aggiuntiva. Sembra una magia malvagia che posso passare una stringa "alcune informazioni" a console.writeline (o qualsiasi altro metodo per quella materia) e la stringa che l'output è diversa.

EDIT: ho trovato la magia. Ovviamente non era magico. Il metodo di scrittura riceve una chiamata da una chiamata a WriteHeader prima della chiamata a WriteLine, dove pensavo che la magia stesse accadendo.

È stato utile?

Soluzione

Puoi ottenerlo sopravvalutando il metodo TraceEvent () nel tuo ascoltatore. Come questo:

    public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message) {
        Console.WriteLine("{0}: {1}", id, message);
    }

Altri suggerimenti

È inoltre necessario sovrascrivere questo sovraccarico di TraceEvent se si utilizza la formattazione:

public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, 
                                int id, string format, params Object[] data)
{
  base.WriteLine(String.Format(format, data));
}

Per esempio:

Trace.TraceInformation("Thread {0} Waiting", Thread.CurrentThread.ManagedThreadId);

Override Will Output Output solo "thread 9 in attesa n" quando dati [0] == 9

Perché non usare Trace.WriteLine("SomeInfo") invece di Trace.TraceInformation("SomeInfo") ?

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