Gravando Erros no Log, em ASP.NET com XML

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Neste artigo veremos como gravar erros no log em um arquivo XML, usando uma aplicação ASP.NET com a linguagem C#.

 Introdução – Todo desenvolvedor deve se prevenir e capturar possíveis erros em suas aplicações utilizando os blocos try/catch. Só que, em determinadas situações, não é suficiente capturarmos o erro e não fazermos nada com ele. Em certos casos é importante também gravarmos os erros em um log para que o mesmo seja recuperado em um momento posterior.

 Nesta série de artigos começaremos a criar, nesta parte, a aplicação ASP.NET e o arquivo XML, que receberá os erros.

 Assim sendo crie a aplicação ASP.NET e adicione a ela um arquivo XML, dando a ele o nome LogErros. Nele, apenas adicione a chave , como é ilustrado na Figura 01.


Figura 01 – Estrutura do arquivo XML

 Na Default.aspx, adicione alguns controles para que o aspx fique parecido como na Listagem 01 (usei um exemplo de formatação do Visual Studio) e o resultado como na Figura 02.

Listagem 01 – Default.aspx


Exemplo Log de Erros





Figura 02 – Layout da página

 Assim iremos gerar as exceções e vermos, logo após as gravarmos no XML, o resultado exibido no GridView.

 Crie uma classe dando a ela o nome GerenciamentoLog. Nela, inicialmente criaremos o método para gravar o registro no XML. A Listagem 02 ilustra este método (lembre-se de declarar o namespace System.XML).

Listagem 02 – Método para gravar o Log em XML


public void GravarErro(string mensagemErro, Exception innerException, string stackTrace)
        {
            try
            {
                //Instancio o objeto da classe XmlDocument que irá carregar o arquivo XML
                XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.Load(HttpContext.Current.Server.MapPath(@"LogErros.xml"));
 
                //Instancio o objeto da classe XmlElement e crio os elementos
                XmlElement xmlElementoPai = xmlDocument.CreateElement("erro");
                XmlElement xmlElementMensagemErro = xmlDocument.CreateElement("mensagemerro");
                XmlElement xmlElementInnerException = xmlDocument.CreateElement("innerexception");
                XmlElement xmlElementStackTrace = xmlDocument.CreateElement("stacktrace");
                XmlElement xmlElementDataErro = xmlDocument.CreateElement("dataerro");
 
                //Atribuo o valor dos parâmetros do método nos objetos criados anteriormente
                xmlElementMensagemErro.InnerText = mensagemErro;
 
                if (innerException != null)
                    xmlElementInnerException.InnerText = innerException.ToString();
                else
                    xmlElementInnerException.InnerText = "sem InnerException.";
               
                xmlElementStackTrace.InnerText = stackTrace;
                xmlElementDataErro.InnerText = "Data: " + DateTime.Now.ToShortDateString() +
                    " | Hora: " + DateTime.Now.ToShortTimeString();
 
                //Adiciono o elemento XML na lista de nós filhos do objeto xmlElementoPai
                xmlElementoPai.AppendChild(xmlElementMensagemErro);
                xmlElementoPai.AppendChild(xmlElementInnerException);
                xmlElementoPai.AppendChild(xmlElementStackTrace);
                xmlElementoPai.AppendChild(xmlElementDataErro);
 
                //Adiciono o elemento XML na lista de nós filhos do objeto xmlDocument
                xmlDocument.DocumentElement.AppendChild(xmlElementoPai);
 
                //Salvo os dados do xmlDocument no arquivo XML
                xmlDocument.Save(HttpContext.Current.Server.MapPath(@"LogErros.xml"));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

 Acho que os comentários no código falam por si só. Assim eu gravo os dados no arquivo XML.

 Agora dê dois cliques no botão Gerar Exceção, para que o mesmo crie seu evento click. Nele, adicione o código da Listagem 03.

Listagem 03 – Gerando a Exceção


protected void btnGerarExcecao_Click(object sender, EventArgs e)
       {
            GerenciamentoLog objLogErros = new GerenciamentoLog();

           try
            {
                // Simulação de erro - tentativa de divisão por 0
                int numero = 0;
                int resultado = 5 / numero;
            }
            catch (Exception ex)
            {
                objLogErros.GravarErro(ex.Message, ex.InnerException, ex.StackTrace.TrimStart());
            }
        }

 Assim simulamos uma exceção, para que o método que criamos na Listagem 01 seja utilizado. O resultado pode ser visto na Figura 03.


Figura 03 – Arquivo XML

em nossa classe GerenciamentoLog criaremos o método para consultar os dados do arquivo XML e os exibirmos em nosso GridView.

 Usaremos o namespace System.Data. Comece declarando a variável que conterá o caminho físico do seu arquivo XML, como é ilustrado na Listagem 04 (altere o caminho pelo do seu computador).

Listagem 04 – Variável com o caminho físico do arquivo XML

private String strNomeArquivo = @"C:\Users\Wellington\Documents\Visual Studio 2008Projects\Artigos\Blog\ExemploLogdeErros\ExemploLogdeErros\LogErros.xml";
Agora crie o método para consultar os dados no XML e retorná-los em um DataSet, como pode ser visto na Listagem 05.

Listagem 05 – Método para Retornar os Dados do XML

public DataSet ConsultarDados()
        {
            DataSet objDataSet = new DataSet();
            objDataSet.ReadXml(strNomeArquivo);
            return objDataSet;
        }

 Note que, com uma única linha, conseguimos carregar um DataSet com os dados do XML, por meio do método ReadXml, onde é passado o caminho do arquivo, definido na variável criada na Listagem 04.

 Crie o método para preencher o GridView, como pode ser visto na Listagem 06.

Listagem 06 – Carregando o GridView com os dados do XML

private void CarregarDados()
        {
            GerenciamentoLog objLogErros = new GerenciamentoLog();
            grdExcecoes.DataSource = objLogErros.ConsultarDados();
            grdExcecoes.DataBind();
        }
  Também com poucas linhas conseguimos preencher o GridView, note que o DataSource já recebe o método, que é do tipo DataSet, tipo perfeitamente aceito para ser o DataSource de um GridView.

 A Listagem 07 exibe o método chamado no Page_Load de nossa página, para que o mesmo seja carregado apenas se não for PostBack da página.

Listagem 07 – Evento Page_Load

]

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                CarregarDados();
            }
        }
[/CODE

 Se rodarmos a aplicação, do jeito que está, não teremos resultado no GridView. Isso acontece porque setamos a propriedade AutoGenerateColumns, do GridView, para False. Se alterarmos seu valor para True e rodarmos novamente a aplicação, teremos o seguinte resultado, como ilustrado na Figura 04.


Figura 04 – GridView carregado com o XML, sem formatação

 Podemos melhorar um pouco a formatação e até diminuirmos a largura da coluna em que é exibido o stacktrace. Para isso, altere o aspx do GridView, como pode ser visto na Listagem 08.

Listagem 08 – ASPX do GridView alterado


            
            
            
            
            
            
            
                
                    
                        
                    
                
                
                    
                        
                    
                
                
                    
                        
                    
                
                
                    
                       
                    
                
            

 Note que, além de adicionarmos as colunas e definirmos uma largura para uma delas, alteramos novamente a propriedade AutoGenerateColumns para False e adicionamos a chamada ao evento RowDataBound. É nesse evento que passaremos os valores do XML para os Literals criados no ASPX, como visto na Listagem 09.

Listagem 09 – Carregando os dados dinamicamente

protected void grdExcecoes_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowState == DataControlRowState.Alternate)
            {
                DataRowView objDataRow = (DataRowView)e.Row.DataItem;
                if (objDataRow != null)
                {
                    Literal litMensagemErro = (Literal)e.Row.FindControl("litMensagemErro");
                    Literal litInnerException = (Literal)e.Row.FindControl("litInnerException");
                    Literal litStackTrace = (Literal)e.Row.FindControl("litStackTrace");
                    Literal litDataErro = (Literal)e.Row.FindControl("litDataErro");
 
                    litMensagemErro.Text = objDataRow["mensagemerro"].ToString();                   
                    litInnerException.Text = objDataRow["innerexception"].ToString();
                    litStackTrace.Text = objDataRow["stacktrace"].ToString();
                    litDataErro.Text = objDataRow["dataerro"].ToString();
                }
            }
        }

 Rodando novamente a aplicação, vemos o resultado na Figura 05.


Figura 05 – GridView carregado com o XML, com formatação

 Assim finalizo o artigo. Muito obrigado a todos!

 Um abraço, e até o próximo artigo.

 Wellington Balbo de Camargo

 wellingtonbalbo@gmail.com 
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?