TwitterAppender: de log4net a Twitter

Mantener algún tipo de registro de lo que pasa en una aplicación es un requisito básico si pretendemos no volvernos locos averiguando lo que pasó durante aquel eclipse de luna en que el usuario jura no haber tocado nada pero la aplicación dejó de funcionar.

Para esto hay miles de alternativas, desde hacerte tu propia clase (¿cómo de complicado puede ser escribir a un fichero de texto?) hasta usar auténticas soluciones enterprise, con su herramienta de configuración especial y todo.

Personalmente me gusta bastante log4net, del que ya he hablado en otras ocasiones, porque tiene un buen equilibrio entre funcionalidades y complejidad de uso.

En la terminología de log4net, un appender es una clase encargada de almacenar los eventos generados en un log. Así, tenemos appenders para escribir ficheros de texto, insertar en bases de datos, añadir al registro de sucesos de Windows o incluso enviar emails.

Todo esto está muy bien, pero un mundo 2.0 de redes sociales y smartphones, ¿qué mejor que hacer que tu aplicación te avise por Twitter de que necesita que la cuides?

TwitterAppender

Aprovechando TinyTwitter, hacer un appender para log4net que registre las incidencias es twitter es muy fácil:

public class TwitterAppender : AppenderSkeleton
{
   public string ConsumerKey { get; set; }
   public string ConsumerSecret { get; set; }
   public string AccessToken { get; set; }
   public string AccessSecret { get; set; }

   protected override void Append(LoggingEvent loggingEvent)
   {
       var twitter = new TinyTwitter(new OAuthInfo
       {
           AccessSecret = AccessSecret,
           ConsumerSecret = ConsumerSecret,
           AccessToken = AccessToken,
           ConsumerKey = ConsumerKey
       });
       
       var status = RenderLoggingEvent(loggingEvent);

       if (status.Length > 140)
           status = status.Substring(0, 137) + "...";
       
       twitter.UpdateStatus(status);
   }
}

Lo único que hay que hacer es crear una clase derivada de AppenderSkeleton y redefinir el método Append. Para obtener el texto que tenemos que twittear, podemos aprovechar el método RenderLoggingEvent que se encarga de aplicar al evento el formato que se haya definido en la configuración del appender.

Hay que tener en cuenta que para acceder a twitter necesitaremos unos cuantos tokens OAuth y que tendremos que indicarle esos tokens de alguna forma a nuestro appender.

Por suerte, con log4net es sencillo pasar parámetros de configuración a los appenders definiendo propiedades en el appender e indicando luego los valores en el fichero xml de configuración de log4net:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <configSections>
       <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
   </configSections>

   <log4net>
       <appender name="TwitterAppender" type="ConsoleApplication33.TwitterAppender">
           <consumerKey>YOUR_CONSUMER_KEY</consumerKey>
           <consumerSecret>YOUR_CONSUMER_SECRET</consumerSecret>
           <accessToken>YOUR_ACCESS_TOKEN</accessToken>
           <accessSecret>YOUR_ACCESS_SECRET</accessSecret>

           <layout type="log4net.Layout.PatternLayout">
               <conversionPattern value="%date{HH:mm:ss,fff} : %message"/>
           </layout>
       </appender>

       <root>
           <level value="INFO" />
           <appender-ref ref="TwitterAppender"/>
       </root>
   </log4net>
</configuration>

En un caso real limitaríamos el tipo de mensajes que se envían por twitter para no saturar el timeline. En la documentación de log4net tenéis ejemplos para filtrar por el nivel de los mensajes, por el contenido, etc.,

Resumen

La utilidad real de esto es más que discutible, pero no deja de ser una forma curiosa de estar al tanto de los problemas que puedan surgir en una aplicación.

Además, es un buen ejemplo de lo fácil que resulta extender una librería, en este caso log4net, cuando está bien diseñada, y nunca me cansaré de repetir lo importante que es eso.

Un comentario en “TwitterAppender: de log4net a Twitter

  1. Pingback: Diseño de APIs con interfaces y extension methods

Comentarios cerrados.