sábado, 25 de julio de 2015

Receta C# No. 5-24: Cómo Escribir Datos de Registro (Log) a un Archivo

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Método static File.WriteAllLines
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta ocasión tendremos la oportunidad de aprender el proceso de escritura de registros de actividad, excepciones, errores, advertencias, y demás información relacionada de los eventos de una aplicación en un archivo de registro (o log, si prefieren el anglicismo) (aunque es posible escribir en otros medios como bases de datos, en una cola de mensajería, correo electrónico, sobre un evento WMI, a través de librerías especializadas como Logging Application de Enterprise Library). ¡Empecemos!

1. Problema

El diseño de una aplicación requiere escribir eventos de errores, excepciones, etc. en un registro de eventos en formato de texto plano.

2. Solución

Una solución práctica para este requerimiento es utilizar el método File.WriteAllLines (System.IO).

3. Discusión de la Solución

3.1 Método static File.WriteAllLines

Con el método static File.WriteAllLines [2] (System.IO) podemos escribir en un nuevo archivo una o más líneas de texto (registros, en este caso) contenidas en un arreglo u objeto IEnumerable [3], y una vez finalizada la escritura cerrar el archivo. Este método posee las siguientes versiones sobrecargadas: 
Versiones sobrecargadas de File.WriteAllLines
Figura 1. Versiones sobrecargadas de File.WriteAllLines [2].
Continuando, el sistema de codificación para la escritura de datos de estos métodos es UTF-8; sin embargo, es posible cambiarlo con las dos última versiones sobrecargadas que se muestran en la Figura 1 (i.e., [4, 5]).

Vale advertir que si el archivo destino para escritura ya existe en el sistema de archivos, éste es sobrescrito.

Creemos un ejemplo de uso con la versión sobrecargada WriteAllLines(string, string[]):

Ejemplo de uso

En la línea 20 declaramos un arreglo de elementos string para contener cada uno de los registros de evento. En las líneas 23 y 31 creamos cadenas de caracteres para indicar el inicio y generación de una excepción, respectivamente.


Con la invocación de File.WriteAllLines (línea 35) escribimos en el archivo log.txt todos los elementos contenidos en el arreglo eventos (e inclusive las cadenas vacías).

Agregamos una línea extra al archivo de registro de eventos para registrar el tiempo de fin de la aplicación (línea 39): File.AppendAllText(archivo, tiempoFin).

Finalmente, con las líneas 43-53 mostramos el contenido del archivo log.txt.


Compilación: 


  1. csc /target:exe UsoWriteAllLines.cs


Ejecución assembly


  1. .\UsoWriteAllLines.exe

> Prueba de ejecución: 
Ejecución assembly UsoWriteAllLines.exe

4. Práctica: Código C#

Crearemos una nueva aplicación consola para demostrar una capacidad interesante: filtro de registros con consulta LINQ [7].

En la línea 17 creamos una lista con objetos string para adicionar los registros de eventos. Líneas 20-27: Adición de registros de eventos de excepción y errores. Sobre la línea 30 invocamos al método File.WriteAllLines para escribir sobre el archivo log_completo.log todos los registros de eventos contenidos en registros.


En el caso de la línea 33, donde invocamos al método WriteAllLines al que especificamos como archivo destino log_errores.log y especificamos un filtro para escribir sólo los eventos de error con la expresión/consulta LINQ 

registros.Where( e => e.StartsWith("Error")


Con esta expresión estamos indicando que sólo se deben incluir aquellas cadenas de caracteres que empiecen con "Error".

Las líneas restantes (líneas 36-49) se encargan de mostrar el contenido de los archivos log_completo.log y log_errores.log.


Compilación: 


  1. csc /target:exe FiltroRegistros.cs


Ejecución assembly


  1. .\FiltroRegistros.exe

> Prueba de ejecución: 
Ejecución assembly FiltroRegistros.exe
Figura 3. Ejecución assembly FiltroRegistros.exe.

5. Conclusiones

Podemos concluir que el método File.WriteAllLines provee flexibilidad para la escritura de archivos de registros de eventos; además, con la combinación de LINQ es posible crear expresiones para filtrar el contenido de los registros de eventos y crear archivos con la información de interés.


En la próxima receta C# estudiáremos un tema relacionado al que acabamos de estudiar: procesamiento de un archivo de registros de eventos.

6. Glosario

  • Archivo
  • Evento
  • Filtro
  • Log
  • Registro

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: File.WriteAllLines Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.file.writealllines(v=vs.110).aspx
[3]: IEnumerable(T) Interface (System.Collections.Generic) - https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx
[4]: File.WriteAllLines Method (String, String[], Encoding) (System.IO) - https://msdn.microsoft.com/en-us/library/3det53xh(v=vs.110).aspx
[5]: File.WriteAllLines Method (String, IEnumerable(String), Encoding) (System.IO) - https://msdn.microsoft.com/en-us/library/dd383463(v=vs.110).aspx
[6]: File.AppendAllText Method (String, String) (System.IO) - https://msdn.microsoft.com/en-us/library/ms143356(v=vs.110).aspx
[7]: Language Integrated Query - Wikipedia, la enciclopedia libre - https://es.wikipedia.org/wiki/Language_Integrated_Query


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.