Como: criar e inicializar fontes de rastreamento
Observação
Este artigo é específico para aplicativos .NET Framework. Não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
A classe TraceSource é usada por aplicativos para produzir rastreamentos que podem ser associados ao aplicativo. TraceSource fornece métodos de rastreamento que permitem rastrear eventos com facilidade, rastrear dados e emitir rastreamentos informativos. A saída de rastreamento de TraceSource pode ser criada e inicializada com ou sem o uso de arquivos de configuração. Este tópico fornece instruções para ambas as opções. No entanto, recomendamos o uso de arquivos de configuração para facilitar a reconfiguração dos rastreamentos produzidos por origens de rastreamento em tempo de execução.
Para criar e inicializar uma origem de rastreamento usando um arquivo de configuração
Crie um projeto de aplicativo de console do Visual Studio (.NET Framework) e substitua o código fornecido pelo código a seguir. Esse código registra erros e avisos e gera alguns deles no console e outros no arquivo myListener que é criado pelas entradas no arquivo de configuração.
using System; using System.Diagnostics; class TraceTest { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { // Issue an error and a warning message. Only the error message // should be logged. Activity1(); // Save the original settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Create a new event type filter that ensures // warning messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Warning); // Allow the trace source to send messages to listeners // for all event types. This statement will override // any settings in the configuration file. // If you do not change the switch level, the event filter // changes have no effect. mySource.Switch.Level = SourceLevels.All; // Issue a warning and a critical message. Both should be logged. Activity2(); // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } }
Imports System.Diagnostics Class TraceTest Private Shared mySource As New TraceSource("TraceSourceApp") Shared Sub Main(ByVal args() As String) ' Issue an error and a warning message. Only the error message ' should be logged. Activity1() ' Save the original settings from the configuration file. Dim configFilter As EventTypeFilter = CType(mySource.Listeners("console").Filter, EventTypeFilter) ' Create a new event type filter that ensures ' warning messages will be written. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Warning) ' Allow the trace source to send messages to listeners ' for all event types. This statement will override ' any settings in the configuration file. ' If you do not change the switch level, the event filter ' changes have no effect. mySource.Switch.Level = SourceLevels.All ' Issue a warning and a critical message. Both should be logged. Activity2() ' Restore the original filter settings. mySource.Listeners("console").Filter = configFilter Activity3() mySource.Close() Return End Sub Shared Sub Activity1() mySource.TraceEvent(TraceEventType.Error, 1, "Error message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity2() mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity3() mySource.TraceEvent(TraceEventType.Error, 4, "Error message.") mySource.TraceInformation("Informational message.") End Sub End Class
Adicione um arquivo de configuração de aplicativo, caso um não esteja presente, ao projeto para inicializar a origem de rastreamento chamada
TraceSourceApp
no exemplo de código da etapa 1.Substitua o conteúdo do arquivo de configuração padrão pelas configurações a seguir para inicializar um ouvinte de rastreamento do console e um ouvinte de rastreamento do text writer na origem de rastreamento que foi criada na etapa 1.
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Error"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>
Além de configurar os ouvintes de rastreamento, o arquivo de configuração cria filtros para ambos os ouvintes e cria uma opção de origem para a origem de rastreamento. Duas técnicas são mostradas para a adição de ouvintes de rastreamento: adicionar o ouvinte diretamente à origem de rastreamento e adicionar um ouvinte à coleção de ouvintes compartilhados e, em seguida, adicioná-lo pelo nome à origem de rastreamento. Os filtros identificados para os dois ouvintes são inicializados com níveis de origem diferentes. Isso resulta na gravação de algumas mensagens por apenas um dos dois ouvintes.
O arquivo de configuração inicializa as configurações para a origem de rastreamento no momento em que o aplicativo é inicializado. O aplicativo pode alterar dinamicamente as propriedades definidas pelo arquivo de configuração para substituir as configurações especificadas pelo usuário. Por exemplo, talvez você deseje garantir que as mensagens críticas sejam sempre enviadas para um arquivo de texto, independentemente das definições de configuração atuais. O exemplo de código demonstra como substituir as configurações do arquivo de configuração para garantir que as mensagens críticas sejam geradas para os ouvintes de rastreamento.
A alteração das configurações do arquivo de configuração durante a execução do aplicativo não altera as configurações iniciais. Para alterar as configurações, reinicie o aplicativo ou atualize o aplicativo de forma programática usando o método Trace.Refresh.
Para inicializar origens de rastreamento, ouvintes e filtros sem um arquivo de configuração
Use o exemplo de código a seguir para habilitar o rastreamento por meio de uma origem de rastreamento sem usar um arquivo de configuração. Essa não é uma prática recomendada, mas pode haver circunstâncias em que você não deseja depender dos arquivos de configuração para garantir o rastreamento.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { mySource.Switch = new SourceSwitch("sourceSwitch", "Error"); mySource.Listeners.Remove("Default"); TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log"); ConsoleTraceListener console = new ConsoleTraceListener(false); console.Filter = new EventTypeFilter(SourceLevels.Information); console.Name = "console"; textListener.Filter = new EventTypeFilter(SourceLevels.Error); mySource.Listeners.Add(console); mySource.Listeners.Add(textListener); Activity1(); // Allow the trace source to send messages to // listeners for all event types. Currently only // error messages or higher go to the listeners. // Messages must get past the source switch to // get to the listeners, regardless of the settings // for the listeners. mySource.Switch.Level = SourceLevels.All; // Set the filter settings for the // console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Change the filter settings for the console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Information); Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }
Imports System.Diagnostics Imports System.Threading Class Program Private Shared mySource As New TraceSource("TraceSourceApp") Shared Sub Main(ByVal args() As String) mySource.Switch = New SourceSwitch("sourceSwitch", "Error") mySource.Listeners.Remove("Default") Dim textListener As New TextWriterTraceListener("myListener.log") Dim console As New ConsoleTraceListener(False) console.Filter = New EventTypeFilter(SourceLevels.Information) console.Name = "console" textListener.Filter = New EventTypeFilter(SourceLevels.Error) mySource.Listeners.Add(console) mySource.Listeners.Add(textListener) Activity1() ' Allow the trace source to send messages to ' listeners for all event types. Currently only ' error messages or higher go to the listeners. ' Messages must get past the source switch to ' get to the listeners, regardless of the settings ' for the listeners. mySource.Switch.Level = SourceLevels.All ' Set the filter settings for the ' console trace listener. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Critical) Activity2() ' Change the filter settings for the console trace listener. mySource.Listeners("console").Filter = New EventTypeFilter(SourceLevels.Information) Activity3() mySource.Close() Return End Sub Shared Sub Activity1() mySource.TraceEvent(TraceEventType.Error, 1, "Error message.") mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message.") End Sub Shared Sub Activity2() mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message.") mySource.TraceInformation("Informational message.") End Sub Shared Sub Activity3() mySource.TraceEvent(TraceEventType.Error, 4, "Error message.") mySource.TraceInformation("Informational message.") End Sub End Class