Páginas

Pesquisar neste blog

28 de fevereiro de 2019

Criando um Arquivo de Log em C#

Uma boa solução para descobrir bugs no software quando o software está em fase de teste ou até mesmo instalado é criando um arquivo texto de log, que pode ser armazenado no diretório da própria aplicação. Um cuidado que observei na criação de um arquivo de log é o método que utilizamos para criar o arquivo.
Inicialmente utilizei a classe File e o método Create do namespace System.IO:
         // Verifica se o arquivo de log da aplicação já existe
         if (!File.Exists("log_aplicacao.txt"))
         {
             File.Create("log_aplicacao.txt");
         }
                  
O código acima funciona sem problemas desde que o software execute várias outras operações antes de tentar escrever no arquivo de log. Se a próxima operação for por exemplo gravar a iniciação do software logo após criar o arquivo, o software apresentará uma exceção com uma mensagem parecida com “O processo não pode acessar o arquivo log.txt, porque ele está sendo usado por outro processo”.
Esta exceção ocorre pois enquanto o arquivo está sendo criado  o objeto FileStream criado por este método tem um valor default (FileShare de None), ou seja, nenhum outro processo ou código pode acessar o arquivo criado até que o handle do arquivo original seja fechado.

Uma possível solução foi utilizar a classe FileStream e passar o parâmetro FileShare como ReadWrite.
         // Cria o arquivo de log da aplicação
         FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
             FileAccess.ReadWrite, FileShare.ReadWrite);
         fs.Close();
Desde modo logo após a criação do arquivo já é possível escrever no arquivo de log. Segue um exemplo para gravar no log da aplicação a data e hora em que a aplicação foi iniciada.
        static void Main(string[] args)
        {
            try
            {
                 // Verifica se o arquivo de log da aplicação já existe
                if (!File.Exists("log_aplicacao.txt"))
                {
                    // Cria o arquivo de log da aplicação
                    FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
                        FileAccess.ReadWrite, FileShare.ReadWrite);
                    fs.Close();
                }
                // Cria o objeto StreamWriter, passando como parâmetro o nome do
                // arquivo criado anteriormente e o valor booleano true
                // indicando que as informações devem ser acrescentadas no arquivo
                // toda vez que a aplicação for iniciada criando desta forma um
                // arquivo de log com um histório de iniciação da aplicação.
                using (StreamWriter sw = new StreamWriter("log_aplicacao.txt", true))
                {
                    sw.WriteLine("A aplicação iniciada em " + DateTime.Now.ToString());
                    sw.Flush();
                    sw.Close();
                }
                Console.WriteLine("O arquivo foi gerado com suceso!");
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }