martes, 31 de enero de 2012

Como trazar nuestras aplicaciones con log4net

En muchas ocasiones (por no decir en todas) es necesario guardar una traza de lo que hace nuestra aplicación. Esto se convierte en imprescindible cuando se produce una excepción no controlada ya que debemos ver que ha pasado, para en caso que sea necesario controlar esa excepción. Por ejemplo, suele ser muy útil cambiar el mensaje que ve el usuario final cuando se produce una excepción. Siempre será mejor ver "Se ha producido un error inesperado y este ha sido registrado. En caso que el problema persista contacte con administrador" que "Object reference not set to an instance of an object".

La mayoría de las veces el registro de errores suele llevarse a cabo guardando en un fichero de texto el mensaje de la excepción junto con las traza y la hora a la que se ha producido. También podemos incluir más información sobre el sistema operativo del equipo, versión del programa... En otros casos se opta por mandar un correo electrónico con la información del excepción o incluso podemos optar por hacer combinaciones de ambas, guardar la información en un fichero de texto y mandarlo por correo electrónico.

Escribir el código que realice las tareas anteriormente comentadas no es muy complicado pero implica gastar un número de horas y de recursos que en la mayoría de los proyectos no es posible. Por eso, a veces tenemos que buscar soluciones rápidas de implantar y si están ampliamente probadas mejor que mejor. En el peor de los caso solo tendremos que invertir un par de horas en leer la documentación para saber como utilizarla y a partir de ahí tan sólo haremos un copy & paste en todos nuestros proyectos.

Para empezar diré que la librería log4net es una herramienta que ayuda a registrar salidas en una amplia variedad de destinos. Esta librería es una migración de la librería log4j (log for java) y que también podemos encontrar para otros lenguajes como c++ o php.

Lo primero que debemos hacer para usar esta librería (después de leernos aunque sea por encima la documentación) es descargarla de la página oficial o través de nuget. Una vez descargada y añadida la referencia a nuestro proyecto debemos modificar nuestro fichero de configuración (app.config o web.config) añadiendo en la <configuration><configSections> lo siguiente



Luego, crearemos la sección log4net donde añadiremos el tipo de logger que vamos a usar, y que tipo de salida (appender) usaremos.  En mi caso usaré como salida el Sql Server, así que añadiremos lo siguiente a nuestro fichero de configuración

  
    
      
      
        
        
      
      
      
      
      
        
        
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
          
        
      
      
        
        
        
        
      
    
  

También debemos ejecutar el siguiente script sql en nuestra base de datos para almacenar los datos que queramos registrar.

CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

Llegados a este punto ya solo nos queda añadir un par de lineas a nuestro código y ya tendremos nuestro logger funcionando.

try 
{
  // ... código a trazar ...
}
catch (Exception ex)
{
  // Creamos nuestro logger
  ILogger logger = LogManager.GetLogger("Logger");
  // Cargamos la configuración
  XmlConfigurator.Configure();
  // Registramos nuestra excepción
  Logger.Error(ex.Message, ex);
}

Con poco esfuerzo y aprovechando un proyecto que funciona podemos trazar nuestras aplicaciones sin el mayor esfuerzo haciendo nuestras aplicaciones más robustas ya que podremos localizar más fácilmente nuestros puntos débiles y podremos corregirlos.

Como es de suponer log4net dispone de fábrica más appenders como por ejemplo
  • Log4net.Appender.AdoNetAppender
  • Log4net.Appender.AnsiColorTerminalAppender
  • Log4net.Appender.AspNetTraceAppender
  • Log4net.Appender.ColoredConsoleAppender
  • log4net.Appender.ConsoleAppender
  • log4net.Appender.DebugAppender
  • log4net.Appender.EventLogAppender
  • log4net.Appender.FileAppender
  • log4net.Appender.LocalSyslogAppender
  • log4net.Appender.MemoryAppender
  • log4net.Appender.NetSendAppender
  • log4net.Appender.OutputDebugStringAppender
  • log4net.Appender.RemoteSyslogAppender
  • log4net.Appender.RemotingAppender
  • log4net.Appender.RollingFileAppender
  • log4net.Appender.SmtpAppender
  • log4net.Appender.SmtpPickupDirAppender
  • log4net.Appender.TelnetAppender
  • log4net.Appender.TraceAppender
  • log4net.Appender.UdpAppender

Todos ellos listo para utilizar con muy poco esfuerzo. Para saber como usar estos appenders y como se pueden configurar recomiendo revisar la documentación oficial.

Happy coding!

Mas info | log4net

sábado, 28 de enero de 2012

Organízate con eficacia


Hace unos día he terminado de leerme el libro Organízate con eficacia de David Alen. Parece que productividad personal está en auge y cada vez se pueden encontrar más personas que utilizan este método en su vida profesional y personal. Animado por esta tendencia decidí comprarme el libro y ver que me podía aportar a mi pequeño mundo, tanto profesional como laboral.

Resumido de una manera rápida, el sistema que describe David Allen en su libro, denominado GTD (obtenido del acrónimo del título del libro, Getting Things Donde), afirma ser un sistema sencillo y útil para mantener nuestras tareas controladas y organizadas, liberándonos del estress que supone tener una lista de tareas en la cabeza y permitiendo que mantengamos la mente ocupada en lo que realmente interesa: hacer cosas en lugar de pensar en lo que tendríamos que estar haciendo.

A medida que me iba leyendo el libro me iba dando cuenta que muchas de las cosas que indicaba el autor yo ya las hacía. A mi manera claro está, pero las hacía. En mi puesto de trabajo siempre tengo una libreta y un bolígrafo. Ésto último lo compruebo a diario ya que el "come boligrafos" siempre asecha y nunca se sabe cuando puede atacar. Me molesta bastante querer escribir algo que se me ocurre o que pienso que tengo que hacer y ver que no tengo como hacerlo. Pese a mi profesión y la relación que mantengo con la informática, sigo confiando plenamente en mi libreta, aunque aplicaciones como evernote le está quitando parte del peso que tienen en mi forma de organizarme.

Muchas de las cosas que el autor comentan me parecen excesivas para mi trabajo y mi ritmo de vida. Se que el autor recomienda el método para evitar tener que estar recordando constantemente que tenemos que hacer (siguiente acción a realizar) pero rara vez se me olvida algo y eso es debido a que todo lo suelo hacer cuanto antes, así no dejo que las cosas se acumulen.

Destacó que entre los diversos consejos que da el autor he empezado a utilizar varios de ellos con excelente resultados

  1. La regla de los dos minutos. Esta regla viene a decirnos que si una tarea lleva menos de dos minutos no se puede planificar, simplemente hay que ejecutarla. Pero hay que tener claro que son dos minutos y no más. En mi caso lo estoy aplicando a la hora de contestar correos electrónicos, ya que antes de contestar pienso si me va a llevar más de dos minutos. Me he dado cuenta que el 50% de los correos que mando llevan más de ese tiempo así que ahora ahora los planifico y los ejecuto cuando proceso la lista "correos electrónicos" en momentos del día donde mi nivel de concentración ha caído y deseo hacer algo que no requiera demasiado esfuerzo.
  2. Otro consejo útil que me he apuntado es del archivar todos los correos electrónicos de la bandeja de entrada y solo dejar visibles aquellos a los que se quiera hacer un seguimiento. En mi caso, en la bandeja de entrada estaban todos los correos electrónicos y a veces me suponía un esfuerzo tener que localizar un correo en concreto (pese a que los tengo etiquetados). Sobre todo porque a veces después de procesar un correo no le quitaba la marca y eso provocaba tener a simple vista muchos correos pendientes (también dificultaba la búsqueda de un correo a simplemente vista, obligándome a tener que usar el buscador del gestor de correo electrónico). Ahora solo tengo en la bandeja de entrada los correos a procesar y soy más riguroso en su procesamiento, ya que una vez que contesto y no tengo que hacer seguimiento archivo el correo "para perderlo de vista". Esta regla es especialmente fácil de aplicar si usas gmail como gestor de correo electrónico.
  3. También me he apuntado el crear lista para futuros proyectos (algún día) donde desde hace un tiempo estoy apuntado cosas que se me ocurren, ya sean negocios a estudiar o simplemente mejoras sobre los proyectos en los que estoy trabajando pero donde ahora una mejora no es posible. Intento ser más riguroso y lo apunto todo (herramientas como evernote lo facilitan mucho, ya que incluso puedo almacenar notas de audio) para procesarlo en un futuro.

En definitiva, un buen libro que recomiendo para los que no tengan un sistema de organización, o para los que lo tengan, como era mi caso, y deseen ver otro punto de vista y desde donde puedan sacar nuevas ideas para mejorarlo.

Mas info | Organízate con eficacia, David Alen, Getting Things Done (GTD), Evernote

viernes, 13 de enero de 2012

Como publicar una aplicación ASP.NET MVC3 en un IIS5

Esta mañana, en un pequeño desarrollo que estoy haciendo en ASP.NET MVC3 me he tropezado con un pequeño problema al publicar la aplicación en un Windows Small Business Server 2003. Este versión usa el IIS 5, y al publicar me tropecé con este error al acceder a la URL http://miaplicacion/home/index


El error básicamente es un error 404 debido a que el IIS no puede resolver las redirecciones que usa el ASP.NET MVC3 del tipo midominio.com/controladora/accion/parametos.

Los primero que hice fue comprobar que tanto el Framework 4.0 y el ASP.NET MVC3 estaban instalados en el servidor y tras comprobarlo no quedo más remedio que recurrir a San Google para buscar la solución al problema.

Me di cuenta que mi problema era bastante común y tras buscar un poco por varios foros encontre dos tipo soluciones

- En entornos donde no es posible acceder al IIS (por ejemplo en hosting contratados) lo mejor es modificar los ruteos que se configuran en el Global.asax. Esta solución no la probé pero hay varios ejemplos en Internet que dicen que ruta hay añadir.

- En caso donde tengamos acceso al IIS la solucion es bastante simple
  1. Hacemos click con la botón derecho sobre las 'Propiedades' de nuestro sitio web.
  2. En la pestaña 'Directorio' hacemos click en el botón que pone 'Configuración'.
  3. Seleccionamos la pestaña 'Asignaciones'
  4. Hacemos click en el botón 'Insertar'
  5. Pegamos la ruta hacia el fichero aspnet_isapi.dll en el campo que pone 'Ejecutable'. En mi caso la ruta  es 'c:\windows\microsoft.net\framework\v4.0.30319\aspnet_isapi.dll'. Se copia la ruta del mapeo de los ficheros .aspx.
  6. Desmarcamos el check que pone 'Comprobar si el archivo existe'.
  7. Le damos a 'Aceptar'


Hecho esto la aplicación funcionaba perfectamente, evitando tener que tocar las tablas de ruteo, aunque esto no es siempre posible.

Happy coding!

martes, 3 de enero de 2012

Como mostrar una imagen con ASP.NET MVC3

Supongamos que queremos cargar una imagen que se encuentra en nuestro sistema de fichero de manera dinámica. Bien, en nuestro cshtml debemos poner el siguiente código

<img src="@Url.Action("showimage", "rest", new { id = 1 })" alt="" />

Y en nuestra controladora deberemos declarar la siguiente acción

public ActionResult showimage(int id) 
{
    var path = Server.MapPath("~/content/image");
    var file = string.format("{0}.png", id);
    var fullPath = Path.Combine(path, file);
    return File(fullPath, "image/png", file);
}

Happy coding!