Dev (Back & Front)ARTIGO

Log de acesso para o site com XML em ASP.NET e Silverlight. Parte A

Olá amigos. Na parte A deste artigo vou mostrar como criar um log de acesso para o seu site, salvando as informações em um XML.

Na Parte B, vou exibir um relatório com gráfico utilizando MS-SilverLight. Gostaria de ressaltar que relatório não necessariamente precisa ser exibido utilizando a tecnologia Silverlight.

Imagem de exemplo do Gráfico gerado com o SilverLight.Imagem de exemplo do Gráfico gerado com o SilverLight.Imagem de exemplo do Gráfico gerado com o SilverLight.

O IHttpModule

O IHttpModule é o módulo Http chamado sempre que houver uma requisição em seu sistema Web. O IHttpModule é geralmente utilizado para implementar uma camada de Segurança, Log de acesso ou cabeçalhos/rodapés personalizados.

Pré-requisitos (Parte A)

Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes. Para criar o sistema de log:

  • Framework ASP.NET 2.0 com VB.net
  • Visual Studio 2005.

Mãos à obra

Crie uma novo site web no Visual Studio e, em seguida, crie a pasta App_Code.

Crie agora dois arquivos “Class” em VB, chamado logModule.vb. e outro “log.vc”

Apenas como guia, segue um printscreen da estrutura de diretórios deste projeto:

Classe de Log

Esta classe terá as propriedades e métodos necessários para salvar um log que acesso do seu usuário. Criamos parâmetros que recebem as informações de acesso do usuário, como Data, IP do usuário, Browser que ele utilizou para acessar a página, entre outras.

Primeiro vamos adicionar as propriedades

Imports Microsoft.VisualBasic

Public Class log

#Region "Propriedades"

    ''' <summary>
    ''' Retorna a data atual
    ''' </summary>
    ''' <remarks></remarks>
    Private m_dData As DateTime
    Public Property Data() As DateTime
        Get
            Return m_dData
        End Get
        Set(ByVal value As DateTime)
            m_dData = value
        End Set
    End Property

    ''' <summary>
    ''' Retorna o IP do usuário
    ''' </summary>
    ''' <remarks></remarks>
    Private m_IP As String
    Public Property IP() As String
        Get
            Return m_IP
        End Get
        Set(ByVal value As String)
            m_IP = value
        End Set
    End Property

    ''' <summary>
    ''' URL da Página
    ''' </summary>
    ''' <remarks></remarks>
    Private m_sURL As String
    Public Property URL() As String
        Get
            Return m_sURL
        End Get
        Set(ByVal value As String)
            m_sURL = value
        End Set
    End Property

    ''' <summary>
    ''' Query String da Página
    ''' </summary>
    ''' <remarks></remarks>
    Private m_sQuery As String
    Public Property Query() As String
        Get
            Return m_sQuery
        End Get
        Set(ByVal value As String)
            m_sQuery = value
        End Set
    End Property

    ''' <summary>
    ''' Browser que o usuário está usando
    ''' </summary>
    ''' <remarks></remarks>
    Private m_sBrowser As String
    Public Property Browser() As String
        Get
            Return m_sBrowser
        End Get
        Set(ByVal value As String)
            m_sBrowser = value
        End Set
    End Property

    ''' <summary>
    ''' De onde o visitante veio para a página
    ''' </summary>
    ''' <remarks></remarks>
    Private m_sURLAnterior As String
    Public Property UrlAnteriol() As String
        Get
            Return m_sURLAnterior
        End Get
        Set(ByVal value As String)
            m_sURLAnterior = value
        End Set
    End Property

#End Region

Em Seguida, vamos criar o método salvarLog() que será responsável em salvar 0 nosso log de acesso em um arquivo .XML.

#Region "Salvar"

    ''' <summary>
    ''' Salva o log em um .xml
    ''' </summary>
    ''' <param name="sCaminhoCompleto">
    ''' Caminho completo do arquivo de log.
    ''' </param>
    ''' <remarks>
    ''' Pode ser implementado para salvar em um banco de dados.
    ''' </remarks>
    Public Sub salvarLog(ByVal sCaminhoCompleto As String)

        If System.IO.File.Exists(sCaminhoCompleto) Then

            ' Exemplo didático de como criar uma estrutura de tabela
            Dim dt As New Data.DataTable
            dt.TableName = "Log"
            dt.Columns.Add("Data")
            dt.Columns.Add("IP")
            dt.Columns.Add("URL")
            dt.Columns.Add("Query")
            dt.Columns.Add("Browser")
            dt.Columns.Add("URLAnterior")

            ' Leio o XML
            dt.ReadXml(sCaminhoCompleto)

            ' Crio uma nova linha
            Dim dr As System.Data.DataRow = dt.NewRow

            ' Atribuo os valores para a linha
            dr("Data") = m_dData.ToString("dd/MM/yyyy HH:mm:ss")
            dr("IP") = m_IP
            dr("URL") = m_sURL
            dr("Query") = m_sQuery
            dr("Browser") = m_sBrowser
            dr("URLAnterior") = m_sURLAnterior

            ' Adiciono a linha para a tabela
            dt.Rows.Add(dr)

            ' Salvo o arquivo
            dt.WriteXml(sCaminhoCompleto)

        End If

    End Sub

#End Region 

End Class

Implementando o IHttpModule

Abra agora o seu arquivo “logModule.vb”

Vamos marcar que estamos implementando o módulo IHttpModule.

Public Class logModule

Implements System.Web.IHttpModule

Após digitarmos “Implements IHttpModule” e apertarmos “enter” será automaticamente criado no Visual Studio 2005 os métodos Init e Dispose.

Recebendo as informações de acesso

No método abaixo, vamos receber as informações do acesso do usuário como Browser, Página, IP, de onde ele veio e Data. Para isto, vamos instanciar a classe log do arquivo que acabamos de criar no arquivo log.vb, e chamar o método salvar.


  ''' <summary>
    ''' Sub que salva o log que é chamado no load de cada request.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub salvarLog(ByVal sender As Object, ByVal e As EventArgs)

        Dim oLog As New log

        oLog.Data = Date.Now
        oLog.IP = System.Web.HttpContext.Current.Request.UserHostAddress.ToString
        oLog.Browser = System.Web.HttpContext.Current.Request.UserAgent.ToString
        oLog.Query = System.Web.HttpContext.Current.Request.QueryString.ToString
        oLog.URL = System.Web.HttpContext.Current.Request.Url.ToString

        ' Se o usuário acessou direto a página, não tem referrer
        Try
            oLog.UrlAnteriol = System.Web.HttpContext.Current.Request.UrlReferrer.ToString

        Catch ex As Exception
            oLog.UrlAnteriol = "Acesso Direto"

        End Try

        ' Eu não quero salvar o log para a tela de relatório
        If InStr(LCase(oLog.URL), "relatorio.aspx") = 0 And InStr(LCase(oLog.URL), "RelatorioSilverLight") = 0 Then
            oLog.salvarLog(sCaminhoArquivoLog & sArquivoLog)
        End If

    End Sub

Validando se o arquivo XML Existe

Por segurança, vamos validar se o arquivo XML existe. Caso o arquivo não exista, vamos lavantar um erro. O Caminho deve ser configurado corretamente no seu web.config.

''' <summary>
    ''' Verifica se o arquivo existe
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ValidarArquivo(ByVal sender As Object, ByVal e As EventArgs)

        If Not System.IO.File.Exists(sCaminhoArquivoLog & sArquivoLog) Then
            Throw New Exception("Configure o arquivo de log corretamente em " & sCaminhoArquivoLog & sArquivoLog & ". O arquivo exemplo está na raíz deste projeto.")

        End If

    End Sub

Inicialização

Métodos de inicialização do logModule. No load vamos chamar a nossa verificação de arquivo, e o método de salvar o arquivo. Note que também criamos duas variáveis para receber as configurações de caminho do nosso arquivo de log.

  Private sCaminhoArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("CaminhoArquivoLog").ToString
    Private sArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("ArquivoLog").ToString

#Region "Load"

    Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
        AddHandler context.PostRequestHandlerExecute, AddressOf ValidarArquivo
        AddHandler context.PostRequestHandlerExecute, AddressOf salvarLog
    End Sub

    Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

    End Sub

#End Region  

Configurando o web.config

Após as nossas duas classes estarem prontas, temos que configurar o web.config para que ele possa chamar o nosso log sempre que houver uma requisição http.

Na tag “Configuration” ? appSettings devemos criar a nossa configuração.

<appSettings>
     
    <!-- Informe corretamente o caminho do seu XML-->
		<add key="CaminhoArquivoLog" value="c:/"/>

    <!-- Informe corretamente o nome do seu Arquivo XML-->
		<add key="ArquivoLog" value="log.xml"/>
    
</appSettings>

Em seguida devemos configurar o HttpModule, para a nossa clase de Log

    <!-- Configura o httpModule, conforme abaixo-->
    <httpModules>
	  <add name="logModule" type="logModule"/>
    </httpModules>

Testando nosso log

Para testar nosso log, crie a quantidade de páginas que você quiser. Conforme for navegando por elas, os valores serão preenchidos no log.

Considerações finais

Finalizamos a Parte A deste artigo. Na parte B vamos mostrar o relatório em um gráfico utilizando o Silverlight.

Clique aqui para dar download no projeto de exemplo.

Forte Abraço.

é engenheiro eletrônico com ênfase em telecomunicações. Residiu por mais de dois anos nos Estados Unidos e é líder de projetos da T4W. Com mais de 12 anos de experiência, participa de projetos para empresas dos mais diversos segmentos. A T4W (www.t4w.com.br) é uma empresa de tecnologia, que além de produtos voltados aos mercados de turismo e imobiliário, possui uma área de desenvolvimento que vem atendendo empresas de médio e grande porte em projetos corporativos e especiais. Thomas A. Semple também escreve periodicamente para as revistas .Net Magazine e Web Mobile. Twitter: @tomalexsemple

Ver perfil