jueves, 23 de junio de 2011

Festival del Humor (I)

Buenas. No me pude resistir.

public class Utilidades {
public int i = 0;
public void GrabaLog(string metodo_llamado, string mensaje_error)
{
try
{
i++;

string filename = "log" + DateTime.Now.Year+"-"+
String.Format("{0:00}",DateTime.Now.Month)+"-"+
String.Format("{0:00}",DateTime.Now.Day) + ".xml";

if (!System.IO.File.Exists(filename))
WriteAlertDoc(filename, "Log");

XmlDocument doc = new XmlDocument();
doc.Load(filename);

XmlElement elem = doc.CreateElement("error");
XmlElement fecha = doc.CreateElement("fecha");
XmlElement metodo = doc.CreateElement("metodo");
XmlElement error = doc.CreateElement("descripcion");
fecha.InnerText = DateTime.Now.ToString("u",DateTimeFormatInfo.InvariantInfo);
metodo.InnerText = metodo_llamado;
error.InnerText = mensaje_error;

elem.AppendChild(fecha);
elem.AppendChild(error);

doc.DocumentElement.AppendChild(elem);
doc.Save(filename);
}
catch (Exception e)
{
if (i<10)
GrabaLog("GrabaLog", e.ToString());
}
}
}

Y, evidentemente, cada escritura en el log de la aplicación se hace con un

// ...
new Utilidades().GrabaLog("NombredelMetodo", "Mensaje del metodo");
// ...

Merece la pena pararse a reflexionar todas las maravillas que hace este cacho de código. Ejercicio apto para programadores Java. A ver cuántas cazáis.

Hint: Llegué a este código al ver que algunas trazas se escribían en un fichero que no era el de log4.net , y en una máquina no salian. Por la consola de resultados nos saltaban 10 errores consecutivos pero la aplicación no partía.

11 comentarios:

  1. ¡Qué condensación de sabiduría en tan pocas líneas! ¡Código así no se ve todos los días! (por desgracia). Todas y cada una de las "genialidades" son argumentos a favor de no reinventar la rueda y de mantener las cosas simples.

    ResponderEliminar
  2. Es como un buen libro, cada vez que lo lees descubres algo nuevo :D

    ResponderEliminar
  3. A ver, ¿qué fuisteis descubriendo?

    Empiezo yo ( aunque es una chorrada ) : Se obtiene la fecha del sistema 4 veces y se hace un ilegible ToString() de la fecha.

    ResponderEliminar
  4. Uno tonto pero significativo: después de todo el guirigay que monta para escribir el log, no llega ni a escribir el metodo_llamado en el xml.

    ResponderEliminar
  5. Otro: si hay una excepción, sólo se llegará a grabar el mensaje de error de la propia excepción, no el original que lo motivó (salvo que de error al grabar, claro)

    ResponderEliminar
  6. ¿Y no os llama la atención que el método no sea estático? ¿Por qué lo haría así?

    ResponderEliminar
  7. ¿Para poder acceder y modificar el atributo contador i de la clase Utilidades?

    ResponderEliminar
  8. ¿Pero por qué no puso el contador y el método static?

    ResponderEliminar
  9. Porque si no no tendría mucho sentido invocarlo con un new de cada vez ;) Igual se pensaba que si ponía static, la variable se convertiría mágicamente en una constante. ¡Quién sabe lo que pasaría por esa cabecita loca!

    ResponderEliminar
  10. Pasado por alto todas las burradas que hay ya mencionadas, me alucina la creatividad con que la gente aborda tareas tan sencillas como formatear los números o las fechas. ¡¡¡Con lo fácil que sería poner DateTime.Today.ToString("dd-MM-yyyy")!!!

    ResponderEliminar