Rastreamento

 

Rob Howard
Microsoft Corporation

25 de janeiro de 2001

Sempre que faço uma apresentação sobre ASP.NET, é sempre divertido watch o público quando a nova funcionalidade de rastreamento é demonstrada. Para aqueles de nós que construíram soluções com ASP, o rastreamento é uma dádiva de Deus!

Na coluna deste mês, vamos examinar o recurso de rastreamento em ASP.NET. Vamos começar discutindo a técnica de rastreamento comum para ASP, Response.Write().

Rastreamento com ASP

Se você for como eu, ao codificar um aplicativo ASP, você usará instruções Response.Write() ao dissecar uma seção problemática do código.

Aqui está um pseudocódigo para ilustrar este ponto:

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

As chamadas Response.Write() no código acima devem parecer bastante familiares, ou seja, temos um erro com o comportamento do nosso código. O erro não é necessariamente um erro de aplicativo ou sistema, como uma falha ao carregar o objeto, mas sim um erro de codificação no qual o código é executado conforme o esperado, mas não retorna o valor esperado.

É claro que também podemos usar um depurador, mas às vezes é mais rápido obter uma saída de rastreamento para descobrir o que o código está fazendo ou simplesmente nos informar como uma determinada seção de código está sendo executada.

Embora as instruções Repsonse.Write() facilitem a depuração do aplicativo rapidamente, elas introduzem código desnecessário em um aplicativo que pode resultar em bugs reais que interrompem aplicativos implantados. Por exemplo, geralmente não é considerado uma coisa boa quando esquecemos de remover uma instrução Response.Write() mais colorida que possa expressar nossos verdadeiros sentimentos sobre o código em que estamos trabalhando.

É claro que há suporte para a mesma funcionalidade de instruções Response.Write() em ASP.NET. Na verdade, ainda me encontro usando Response.Write(), mesmo que agora tenhamos um recurso de rastreamento. Velhos hábitos são difíceis de quebrar.

No entanto, todos devemos tentar quebrar esses velhos hábitos porque a nova funcionalidade de rastreamento nos dá algo que não existia no asp: modo de depuração.

Rastreamento com ASP.NET

Os novos recursos de rastreamento de ASP.NET nos permitem simular instruções Response.Write(), mas não se preocupar em remover as instruções antes de implantarmos nossos aplicativos. Em vez disso, imagine escrever o mesmo código acima, mas em vez de usar Response.Write(), usamos Trace.Write().

O objeto Trace agora é um objeto de página intrínseco, semelhante a Solicitação, Resposta, Servidor etc. Ele pode ser acessado diretamente com nosso código de página.

Vamos dar uma breve olhada na classe Trace .

classe Trace

O rastreamento é exposto como uma propriedade pública em ASP.NET páginas. Quando usamos a propriedade Trace , estamos trabalhando com uma instância da classe TraceContext definida no namespace System.Web .

A classe Trace expõe dois métodos sobrecarregados e duas propriedades. Os dois métodos Warn() e Write(), ambos dão suporte a dois protótipos idênticos:

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

O parâmetro category é usado para identificar o nome da categoria para gravar o valor da mensagem . Isso se tornará mais evidente quando usarmos o método Write() em um exemplo abaixo. O terceiro parâmetro ao qual tanto Warn() quanto Write() dão suporte em seus métodos sobrecarregados é errorInfo. Isso nos permite passar detalhes da exceção para o sistema de rastreamento.

Propriedades

A classe TraceContext dá suporte a duas propriedades públicas: IsEnabled e TraceMode.

  • IsEnabled indica se o rastreamento está habilitado na página ou no aplicativo.
  • TraceMode define ou retorna o modo de classificação que o rastreamento está usando. Examinaremos a configuração do modo de rastreamento quando discutirmos o rastreamento no nível do aplicativo abaixo.

Agora que vimos como é a classe e os métodos e as propriedades compatíveis com a classe TraceContext , vamos examinar um exemplo de Trace.Write().

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

Quando esse código é executado, a saída é:

Figura 1. Exemplo do método Trace.Write()

Obviamente, o método Add() está sendo chamado. No entanto, ao contrário das instruções Repsonse.Write(), as instruções Trace.Write() não aparecem na saída resultante. Para exibir os resultados das instruções Trace.Write(), precisamos habilitar o rastreamento para esta página ou para o aplicativo.

Para habilitar o rastreamento, podemos usar uma diretiva de página ou uma opção de configuração. Vamos ver os dois.

Diretiva De rastreamento de página

Diretivas de página são instruções especiais que ASP.NET usa ao processar uma solicitação para um recurso de ASP.NET. As diretivas de página podem ser usadas para substituir ou aplicar definições de configuração para uma página ASP.NET.

Uma diretiva deve ser o primeiro elemento em uma página. Ele é declarado usando a seguinte sintaxe:

<%@ Directive Attribute="[Value]" %>

Usando a sintaxe acima, veja como informamos a ASP.NET que gostaríamos de habilitar o rastreamento em uma página:

<%@ Page Trace="true" %>

Se adicionarmos a diretiva acima ao código de exemplo, nossa saída de página será um pouco diferente:

Figura 2. Rastreamento habilitado

Agora estamos obtendo a saída de rastreamento adicionada à parte inferior da página. A saída de rastreamento é sempre adicionada no final da página.

Em seguida, vamos ver como habilitamos o rastreamento em um nível de aplicativo. Em seguida, discutiremos o que a saída de rastreamento contém.

Rastreamento de aplicativo

ASP.NET usa arquivos de configuração XML para definir definições de configuração para aplicativos ASP.NET. Cada instalação ASP.NET instala um arquivo de configuração no diretório [system drive]\WinNt\Microsoft.NET\Framework\[version]\ chamado config.web.

O arquivo de configuração define a configuração de ASP.NET padrão e, na Versão Beta 1, é conhecido como o arquivo de configuração raiz. As alterações feitas nesse arquivo afetam todos os nossos ASP.NET aplicativo Web. Também podemos usar arquivos de configuração em nossos aplicativos Web para adicionar ou remover configurações adquiridas do padrão config.web.

Abordarei a configuração mais detalhadamente em uma coluna futura. Por enquanto, usaremos o arquivo de configuração raiz para aplicar as configurações de rastreamento para todos os aplicativos ASP.NET.

Seção Trace

Se abrirmos o arquivo config.web raiz, encontraremos uma seção de rastreamento:

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Há quatro atributos para o elemento de rastreamento :

  • enabled = "[true/false]"— Podemos definir a opção habilitada como true ou false. O rastreamento está habilitado no nível do aplicativo ou está desabilitado no nível do aplicativo. Se definirmos enabled=false, o rastreamento de página ainda terá suporte usando a diretiva Trace discutida anteriormente.
  • requestlimit = " [int]"— O número total de solicitações de rastreamento a serem armazenadas em cache na memória por aplicativo. O rastreamento expõe um recurso especial, Trace.axd, que examinaremos momentaneamente, que é usado para exibir a saída de rastreamento quando pageoutput é definido como false.
  • pageoutput = " [true/false]"— Quando o rastreamento é habilitado por meio do arquivo de configuração, o administrador pode habilitar ou desabilitar o rastreamento em cada página. O rastreamento de pageoutput habilita os detalhes de rastreamento para cada página dentro de um aplicativo. No entanto, o rastreamento de pageoutput pode ser desativado enquanto o rastreamento no nível do aplicativo ainda está habilitado (habilitado como = "true"). Isso mantém as solicitações de rastreamento na memória, de modo que elas estejam disponíveis por meio de trace.axd, que examinaremos momentaneamente, mas não serão exibidas na saída de uma página.
  • tracemode = "[SortByTime | SortByCategory]"— A configuração tracemode nos dá controle sobre como as informações detalhadas de rastreamento são geradas. Os dados podem ser classificados por hora ou categoria, em que a categoria é diferenciada entre as configurações feitas pelo sistema e as configurações de Trace.Write() habilitadas pelo desenvolvedor. Por exemplo, em nosso exemplo, usamos o seguinte: Trace.Write("Inside Add() a:", a.ToString()). O primeiro parâmetro da instrução Trace.Write() é a categoria. Nesse caso, definimos a categoria como "Inside Add() a:". Se classificarmos por categoria (tracemode = "SortByCategory"), esse item será classificado antes que a função de página normal chame na saída do rastreamento. A classificação por tempo, por outro lado, classifica pela quantidade de tempo gasto na chamada.

Usando o rastreamento de aplicativo

Usando o mesmo código de exemplo acima, poderíamos remover a diretiva de página e habilitar a mesma funcionalidade modificando as configurações de config.web de rastreamento.

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

Agora podemos chamar nosso aplicativo de exemplo, removendo a diretiva Page e obter a mesma saída:

Figura 3. Rastreamento habilitado, sem diretiva Page

Mas e se quisermos usar o recurso mencionado anteriormente, no qual habilitamos o rastreamento, mas desabilitamos a saída na página?

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Se solicitássemos o aplicativo de exemplo com as definições de configuração acima, não obteríamos nenhuma saída de rastreamento, embora o rastreamento ainda esteja habilitado. Para exibir a saída do rastreamento, usamos um aplicativo especial chamado trace.axd.

Trace.axd

Trace.axd é um manipulador Http. Um Manipulador Http é uma opção de codificação que nos permite lidar com solicitações/respostas no nível mais básico. Manipuladores Http são equivalentes a extensões ISAPI. No entanto, ao contrário do ISAPI, eles podem ser criados usando qualquer linguagem .NET. Discutirei manipuladores Http mais detalhadamente em uma coluna posterior.

Trace.axd é um manipulador Http que podemos usar para solicitar detalhes de rastreamento do aplicativo. Quando solicitado, receberemos um log de rastreamento das últimas n solicitações; n é determinado pelo valor definido por requestlimit="[int]" em nosso arquivo de configuração.

Para usar trace.axd, basta solicitar trace.axd no mesmo diretório de aplicativo que a solicitação para o aplicativo de exemplo foi feita:

Figura 4. Solicitações de rastreamento de aplicativo

Como você pode ver na captura de tela, apresentamos uma lista de rastreamentos que podemos exibir. Essas exibições de rastreamento são idênticas aos detalhes que o rastreamento adicionaria à página, sem a saída da página incluída:

Figura 5. Detalhes da solicitação

Agora que explicamos como configuramos e usamos o rastreamento, vamos discutir a saída do rastreamento.

Interpretando a saída do rastreamento

A saída fornecida pelo modo de exibição de rastreamento, por meio de Trace.axd ou em uma página, fornece seis seções de detalhes:

  • Detalhes da solicitação – são informações básicas, como a ID da sessão, a hora da solicitação, o tipo de solicitação Http e a resposta Http status código.
  • Informações de rastreamento – esta seção fornece uma exibição de tabela de categorias e mensagens. Se usarmos instruções Trace.Write() em nosso código, os dois parâmetros aceitos por Trace.Write() serão usados como os valores Category e Message , respectivamente. Além disso, somos fornecidos com a hora do primeiro ao último byte.
  • Árvore de controle – embora ainda não tenha sido discutida nesta coluna, ASP.NET usa controles de servidor para nos permitir criar aplicativos declarativamente. A seção Árvore de Controle nos fornece informações sobre controles em nossa página. Somos fornecidos com a ID, o tipo, o tamanho da renderização e o tamanho do estado de exibição do controle. Essas informações nos dão uma ideia de quais controles estamos usando, bem como o custo associado (tamanho de renderização e viewstate).
  • Coleção cookies – todos os cookies que o cliente envia nos cabeçalhos de solicitação são analisados e seus nomes, valores e tamanhos são exibidos.
  • Coleção Headers – cabeçalhos Http apresentados pelo cliente ao servidor são fornecidos nesta seção. É uma tabela simples que lista Nome/Valor.
  • Variáveis de servidor — A seção de variáveis de servidor apresenta uma tabela de pares Nome/Valor de variáveis de servidor.

Usando o rastreamento

Como você pode ver claramente, o rastreamento é um novo e poderoso recurso de ASP.NET projetado para facilitar o desenvolvimento de aplicativos Web. No entanto, pensei que também valeria a pena menção quando você deveria e não deveria usar o rastreamento.

Aplicativos implantados

O rastreamento adiciona sobrecarga adicional às solicitações e não deve ser habilitado para aplicativos implantados. No entanto, as instruções Trace.Write() podem ser deixadas em porque são ignoradas quando o rastreamento não está habilitado.

Para aplicativos implantados nos quais desejamos capturar dados, sugiro o uso das classes encontradas no namespace System.Diagnostics . Essas classes, que tentarei abordar em uma coluna futura, nos permitem gravar diretamente no log de eventos do Windows.

Definitivamente, devemos usar o rastreamento quando estivermos criando um aplicativo, mas desabilitá-lo quando estivermos prontos para implantar o aplicativo, assim como teríamos removido essas instruções Response.Write( ).

Desabilitando Trace.axd

Se você instalou ASP.NET em um servidor Web de produção, recomendamos desabilitar explicitamente Trace.axd. Abra o arquivo config.web raiz, localize a <httphandlers> seção e adicione a seguinte entrada:

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

Nota: Também podemos cortar toda <add/> a entrada, mas a opção <remove> é melhor porque ela deixa o código em nosso arquivo de configuração e atinge a mesma meta, desabilitando trace.axd. Isso será resolvido na Versão Beta 2 do ASP.NET.

Resumo

O recurso de rastreamento em ASP.NET é uma nova maneira poderosa de rastrear o que nosso aplicativo está fazendo. No passado, usamos instruções Response.Write() para rastrear nosso aplicativo conforme ele era executado, mas agora podemos usar instruções Trace.Write() e deixar essas instruções em nosso código implantado. Isso leva a menos bugs porque não estamos removendo o código quando estamos prontos para implantar o aplicativo.

Recursos do ASP.NET

Por fim, eu queria chamar alguns dos novos recursos de ASP.NET disponíveis. https://www.asp.net Visite para saber mais sobre mais recursos ASP.NET.

Rob Howard é gerente do programa para ASP.NET na equipe de .NET Framework. Ele passa o tempo livre que tem com sua família ou pesca de moscas no leste de Washington.