Centralización de log en aplicaciones .NET

Harto de tener que recolectar archivos de log en diferentes equipos para tus aplicaciones .NET, monta un syslog server y centraliza los logs.

¿Qué es un Syslog? Es un estándar de facto para el envío de mensajes de registro en una red informática IP. (Fuente: Wikipedia)

¿Qué es un Syslog Server? Es un equipo que tiene instalado una aplicación de recolección de mensajes de registro.

Con este ejemplo vamos a enviar mensajes desde una aplicación realizada con Visual Basic .NET hacia un Windows 2003 Server donde tenemos instalado un Kiwi Syslog Server
Para el envío vamos a usar el puerto por defecto de escucha de Kiwi (y de todos los syslog) UDP 512.

Lo primero es preparar el Syslog Server, para ello descargamos e instalamos en un equipo. En este caso (Kiwi) instalamos y levantamos el servicio para dejarlo a la escucha.



Añadimos a nuestro proyecto .NET las siguientes referencias:

Imports System.Net.Sockets
Imports System.Text

Nota: las referencias (Imports) permiten hacer referencia a nombres de tipo sin usar el namespace completo.
Ahora creamos el siguiente procedimiento:


    Public Sub sendLog(ByVal logMessage As String)
        Dim clientUDP As New UdpClient
        Dim serverIP As String = "192.168.2.105"
        Dim portUDP As String = "514"

        Dim messageLog As String
        Dim bytCommand As Byte() = New Byte() {}

        messageLog = logMessage
        bytCommand = Encoding.ASCII.GetBytes(messageLog)

        clientUDP.Connect(serverIP, portUDP)
        clientUDP.Send(bytCommand, bytCommand.Length)
        clientUDP.Close()

    End Sub

En el procedimiento se define el cliente UDP para el envío, un servidor y puerto de destino (esto debería estar en un archivo o menú de configuración de la aplicación). 
Sobre el mensaje lo debemos enviar codificados en secuencia de bytes, por lo que codificamos el mensaje que reciba la función con Encoding.ASCII.GetBytes

Ahora implementamos la función en la parte de código que queramos, por ejemplo en el login:

 
   Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        [...]
        sendLog("[Migdal Oz] - Login - Incorrect password or username. The user name in the textbox is: " & txtUserName.Text)
        [...]
    End Sub

Ejecutamos la aplicación y realizamos alguna acción para la que hayamos programado en envío de mensajes al syslog server, en mi caso un login fallido (verificando el user y password con LDAP)


Y en el servidor tenemos el registro centralizado de todos los clientes:


Como se puede observar nosotros solo tenemos que enviar un mensaje el syslog se encarga de rellenar la fecha, el hostname y prioridad (modificable)

Aprovechando las características de los servidores syslog  podemos sacar estadístistica, exportar la información a bases de datos, gráficas además de centralizar los mensajes de la aplicación en un único punto.



Sobre la codificación usada por el estándar syslog

Códigos de recurso (Fuente: RFC 3164.)


0 Mensajes del kernel
1 Mensajes del nivel de usuario
2 Sistema de correo
3 Demonios de sistema
4 Seguridad/Autorización
5 Mensajes generados internamente por syslogd
6 Subsistema de impresión
7 Subsistema de noticias sobre la red
8 Subsistema UUCP
9 Demonio de reloj
10 Seguridad/Autorización
11 Demonio de FTP
12 Subsistema de NTP
13 Inspección del registro
14 Alerta sobre el registro
15 Demonio de reloj
16 Uso local 0
17 Uso local 1
18 Uso local 2
19 Uso local 3
20 Uso local 4
21 Uso local 5
22 Uso local 6
23 Uso local 7

Códigos de severidad

Los 3 bits menos significativos del campo prioridad dan 8 posibles grados. Fuente: RFC 3164.

0 Emergencia: el sistema está inutilizable
1 Alerta: se debe actuar inmediatamente
2 Crítico: condiciones críticas
3 Error: condiciones de error
4 Peligro: condiciones de peligro
5 Aviso: normal, pero condiciones notables
6 Información: mensajes informativos
7 Depuración: mensajes de bajo nivel

No hay comentarios:

Publicar un comentario