Creación De Logs Para Aplicaciones Profesionales


Ir a la página 1, 2  Siguiente

Objetivo: Creación De Logs Para Aplicaciones Profesionales
Se me ha ocurrido escribir este pequeño texto para explicar como se plantea uno la gestión de logs en una aplicación profesional.

Es una cuestión sumamente importante porque a diferencia de las aplicaciones domésticas estas aplicaciones son utilizadas por otras personas en otras instalaciones donde pueden darse un sinfin de circunstancias que hagan que algo aparentemente correcto no funcione bien.

El sistema de Logs además tiene que ser muy claro para poder trazar lo ocurrido. Se trata de que un cliente pueda reclamar ante un fallo de la aplicación y que nosotros podamos precisar rápidamente donde está el error. Es por ello importante que el sistema de logs sea configurable para que podamos aumentar o disminuir la cantidad de información volcada en los logs.

También hay que tener en cuenta la posibilidad de procesos concurrentes que debe llevar cada uno su propio log y uno mas general que permita trazar lo ocurrido rápidamente.

La solución a todo esto es la siguiente:

En un módulo declarar una variable de tipo FILE pública.

También es necesaria una variable pública del nivel de logs que queremos realizar. Este nivel de logs se corresponde con la profundidad de niveles en la estructura de las funciones que debemos realizar.
Public NivelLog as integer


En principio se debe tender a una línea log por función en cada nivel respectivo. En operaciones muy críticas he visto que el número de log tiene dos dígitos. Esto es porque el segundo dígito si es 0 significa que solo va una línea por función, pero si es 1 entonces hay una línea de log a la entrada de cada función y una línea a la salida.

El informe debe mostrar una consistencia documental. Eso significa que a niveles de profundidad mayores, también debe haber un indentado mayor que suele ser un tab.

También hay veces que alguna función no hace una cosa sino varias. En ese caso la función no debería devolver una línea sino varias. La primera mas general indicando la operación realizada y las demás suelen ir con una indentación y algunas flechas del tipo ====> para luego poner las operaciones y valores devueltos (una por línea).

Al iniciar el log se debe incluir siempre unas líneas indicando la siguiente información:
1. Usuario y máquina desde la que se solicita la operación
2. Fecha y hora de inicio del log
3. Ubicación del archivo (path completo).
4. El nombre y versión de la aplicación ejecutada
5. El path donde la aplicación vuelca valores si lo hay
6. El charset del sistema y lenguaje utilizado si compete.

Con esta sencilla regla se podrá deducir los permisos que ese usuario y máquina tenía en ese momento lo cual puede explicar la causa de algún error. La ubicación del archvo es para evitar que se pierda la ubicación que le corresponde si por alguna razón se mueve de su lugar natural.

El nombre del log siempre debe incluir al menos el nombre de la aplicación o función que logea, la fecha y la hora. A menudo también se incluye algún contador o valor de control para distinguir rápidamente el fichero en una gran lista de logs. todos ellos deben llevar la extensión .log

Debe haber un sistema de rotación de logs para evitar en lo posible conservar la información y evitar el llenado de file systems. En sistemas profesionales es muy recomendable dejar /var/log en una partición aparte. Por tanto necesitaremos una variable para definir el volumen ocupado de logs que requerirá la compresión de los archivos. Cada archivo comprimido debe contener el nombre de la aplicación y un contador que indique el orden en que los diversos archivos de log están guardados.
Public MaxLog as long


De manera que nuestra clase para la gestión de logs tendrá las siguientes líneas
Public F as File
Public NivelLog as integer
Public MaxLog as long
Dim HoraInicial as date


Y ahora vendría el código.
La función genérica de logear. Cuando damos la orden de logear se comprueba si el ficheor está o no abierto. Si no lo está lo crea, imprime cabeceras y luego las líneas.
Public Sub Log(Nivel,Texto[] as string)
if Nivel<MaxLog then '---> si la función está en un nivel de profundidad mayor de MaxLog
if not f then '---> No se ha iniciado el log
CabeceraLog()
endif
CuerpoLog(F,Nivel,Texto[])
endif


La función de cabecera. Esta función se utiliza únicamente al iniciar el log. Decide el nombre del log, crea el archivo e imprime la información correspondiente
private function CabeceraLog()
Dim Nombre as string
Nombre=ObtenerNombre
F=new file
F=open nombre for create
print #F, "------------------------------------------------------------"
print #F,"- Usuario: " & user.name & "/" system.domain & " (" & system.host & ")"
print #F,"- Fecha: " & Format(now,"dd/mm/yyyy hh:mm:ss")
print #F,"- Log: " & nombre
print #F,"- Aplicación: " & gb.application.name & " " & gb.application.version
print #F,"- Path: " gb.application.path
print #F,"- Idioma: " & gb.application.language
print #F,"- Charset: " & gb.application.charset
print #F,"--------------------------------------------------------------"
print #F," "
HoraInicial=now
end


Private function ObtenerNombre() as string
Dim PathLog as string, Nombre as string, Contador as integer, NombreAux as string
PathLog=settings["Log/Path",user.home"] '---> obtener el path de una variable de configuración
Contador=1
Nombre=PathLog &/ gb.application.name & "
_" & format(now,"ddmmyyyyhhmmss")
NombreAux=Nombre
do while exist(NombreAux & "
.log")
NombreAux=Nombre & "
_" & Contador
Contador +=1
loop
return nombreAux
end


Esta rutina es las mas compleja (no por su complejidad sino por la cuestión conceptual(
Se debe escribir una línea por función así que en un esquema de programación como este:
sub Main()
Funcion 1
Funcion 11
Funcion 111
Funcion 1111
Funcion 112
Funcion 1121
Funcion 1122
Funcion 12
Funcion 121
Funcion 122
Funcion 2
Funcion 21
Funcion 211
Funcion 2111
Funcion 212
Funcion 2121
Funcion 2122
Funcion 22
Funcion 221
Funcion 222
end
Este esquema tiene un nivel máximo de log de 4. En nivel 0 corresponde a main y el nivel cuatro corresponde a funcion XXXX. Si se indica un nivel de log de valor 2 debería logearse únicamente lo que ocurra en Main y Funcion X.
Por tanto para cada nivel de profunidad también se corresponde con un nivel de indentación en el log.

También ocurre que una función puede obtener varios valores. Si se desea es posible que una función imprima varias líneas. Es por ello que la función de imprimir línea no recibe como parámetro un string sino un array de strings donde cada elemento es una línea a imprimir.
En este caso la primera línea tiene a la izquierda la hora. Las demás sufren una indentación y tienen una flecha.

private Sub Cuerpo(F as File, NivelLog as integer, Linea as string[])
Dim Hora as string, Contador as integer, Indentado as string
Hora="[" & format(now,"hh:mm:ss") & "] "
For Contador=1 to NivelLog '---> crear el indentado para el nivel correspondiente
Indentado &= gb.tab
loop
For Contador=0 to Linea.max '---> si es una línea normal poner la hora y el texto. Si no, poner la flecha y el texto
print #F,iif(Contador=0,Hora & Indentado & Texto[0],Indentado & "=>" & texto[contador])
next
end


Private Sub Pie(F as file)
print #F," -----------------------------------------------------------
print #F,"
Tiempo transcurrido: " & datediff(now,horainicio,gb.second)
F.close
end


De esta forma en nuestra aplicación pondremos una línea indicando la operación que realizamos
log(nivel,"texto")

Donde el nivel será en main el 0, en funcion X el 1, en funcion XX el 2, en función XXX el 3.

Caso de que una función tuviera que logear varias líneas
texto.add("liena 1")
texto.add("linea 2")
texto.add("linea 3")
log(Nivel,Texto)

última edición por soplo el Sabado, 17 Octobre 2009, 15:36; editado 2 veces
Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Muy bueno, soplo. Yo tengo montado algo totalmente distinto. Controlo relativamente bien el entorno en que se ejecutan mis aplicaciones (siempre dentro de mi empresa), por lo que no necesito realmente este sistema. Si funciona en uno funciona en todos.
Sin embargo sí que me es imprescindible conocer quién ha hecho qué con la base de datos. Para eso he montado una cosa muy simple:
Por un lado añado a cada tabla dos campos usr y fmod. usr es el identificador del usuario y fmod es un timestamp que se actualiza al modificar.
Una pequeña función se encarga de añadir dichos campos al registro en cada modificación y alta.
Luego tengo una tabla de Log, donde se graban los datos de usuario, timestamp, tipo de consulta y cadena sql efectuada. (Si la consulta se hizo vía recordsets de gambas aparece un texto algo así como "Borra D.N.I.: " y el dni borrado)

Finalmente una serie de consultas (por día, por usuario, por tipo de operación, etc) ofrecen información sobre la actividad de la base de datos.

Es un poco primitivo pero, de momento, a mí me sirve 100 %.

Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Hola

Para logear operaciones en base de datos o guardar usuario y fecha en que se realizan cambios en registros lo mejor es utilizar triggers aunque no creo que los haya en sqlite. Los triggers son cosas de bases de datos serias como Oracle, Sql Server, SyBase y Mysql.

tienes explicado como se hacen en mysql en este post
Triggers Mysql

Alli hay ejemplos donde se guarda automáticamente el usuario y la fecha en que se realiza un cambio en cada registro y también hay algún ejemplo de como guardar un log en una tabla de todo lo que va ocurriendo en los registros de otra tabla. Todo automático. Tu solo añades o modificas lo tuyo y él hace lo suyo.

última edición por soplo el Sabado, 17 Octobre 2009, 15:21; editado 2 veces
Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Olvide poner la rutina que comprime logs viejos.

Los Logs se van apilando y pueden llegar a llenar un file system. Es por ello conveniente cuando son viejos agruparlos y comprimirlos para ahorrar espacio.

Recuerdo que en el código anterior había una variable Maxlog pensada para indicar la cantidad máxima de espacio que se quiere dedicar a los log.

Así que el código quedaría así
Public Sub ComprobarEspacioLog
Dim EspacioLog as float, EspacioTotal as float, NombreLog as string

for each NombreLog in dir(LogPath,".log") '---> para cada archivo de log
EspacioLog=stat(NombreLog).size/1024 '---> obtener el tamaño del fichero en k
EspacioTotal += EspacioLog '---> acumular espacio
next
if EspacioTotal > MaxLog then '---> hay que comprimir
ComprimirLog
endif
end


Primero obtenemos el nombre que tendrá el archivo comprimido que será el nombre de la aplicación mas la fecha. Si ese archivo ya existe se le añade un contador Nombre_1_fecha o nombre_2_fecha. Eso se hace en la rutina ObtenerNombre que ya utilizamos antes.
Private sub ComprimirLog()
Dim Nombre as string, Comprimir as New Compress

Nombre=ObtenerNombre()
Nombre &= ".log.gz"
Comprimir.type="zlib"
Comprimir.file(Pathlog &/ "*.log",PathLog &/ nombre,Comprimir.Max)


kill Pathlog &/ "*.log"
end


Y así ocurre que al iniciar la aplicación basta con llamar a la rutina ComprobarEspacioLog para que se compruebe el espacio ocupado actualmente por los log. En caso de que sea mas espacio del especificado se busca el nombre del archivo que tendrá los log comprimidos, se comprimen todos los log utilizando el método gz en ese archivo y se borran los log.

Por tanto los log quedan comprimidos en un archivo gz que se llama "nombreaplicacion_fecha.log.gz" con el máximo nivel de compresión.

última edición por soplo el Sabado, 17 Octobre 2009, 21:01; editado 2 veces
Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Interesante lo de los Triggers. Mira que lo tenía olvidado desde el viejo Oracle 6...
Le echaré un ojo.
Como siempre, grande Soplo.

Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Este artículo sobre la creación de logs está muy bien explicado. Creo que algún moderador debería colocar una copia en la "Base de conocimientos".

Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
fabianfv escribió: [Ver mensaje]
Este artículo sobre la creación de logs está muy bien explicado. Creo que algún moderador debería colocar una copia en la "Base de conocimientos".


<!-- Begin Offtopic -->
No es buena cosa duplicar contenidos, pero La Base de Conocimientos está pensada precisamente para estos artículos. Una vez creado el artículo, se crea automáticamente un hilo en el Foro para los comentarios y respuestas, pero el artículo queda disponible para su consulta, que es de lo que se trata.

Quizás sea que aún no están los usuarios familiarizados con este sistema. Para cualquier consulta al respecto estoy a vuestra disposición.
<!-- End Offtopic -->
Saludos

Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
Ciertamente esto debió ser un artículo. Me doy cuenta que hice mal en ponerlo así.

Voy a ver como modificar esto para convertirlo en un artículo y luego si quereis borrais esto y ya está.

No tengo costumbre de hacer artículos y no se bien que formato y tal deben tener. Me preocupa verlo en la web de alguien como si lo hubiera escrito él y cosas así. Yo solo quiero divulgar información y quiero que ese material sea de gambas-es.org y no de un fulano que no ponga la referencia a este lugar.

Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
soplo escribió: [Ver mensaje]
Ciertamente esto debió ser un artículo. Me doy cuenta que hice mal en ponerlo así.

Voy a ver como modificar esto para convertirlo en un artículo y luego si quereis borrais esto y ya está.


Hombre, tanto como que hiciste mal... no. Solo era una sugerencia, pues ciertamente cuando el foro empiece a ser grande en nº de mensajes, luego puede ser más difícil encontrar lo que se busca. De la otra manera digamos que quedaría más estructurado y localizable.

Citar:

No tengo costumbre de hacer artículos y no se bien que formato y tal deben tener. Me preocupa verlo en la web de alguien como si lo hubiera escrito él y cosas así. Yo solo quiero divulgar información y quiero que ese material sea de gambas-es.org y no de un fulano que no ponga la referencia a este lugar.


El que tu artículo esté en una sección o en otra no te garantiza que alguien se apropie de él. Lamentablemente es muy común ver copias de otros artículos firmados por personas diferentes en toda la Red, en lugar de hacer la referencia obligada al autor y sitio original.
Hay herramientas para detectar este tipo de abusos y poder al menos "avisar" al plagista:

http://www.copyscape.com/

http://approbo.citilab.eu/

Perfil MP  
Objetivo: Re: Creación De Logs Para Aplicaciones Profesionales
A ver

He pasteado el texto a un documento HTML así que ahora tengo ese post y el documento html. Quisiera que me dijerais si preferis que haga un pasteo del texto a un post en base del conocimiento, si preferís el artículo html descargable o si lo dejo como está.


Lo que pretendo es que la documentación quede bien y completa a disposición de todo el mundo.

También me gustaría algunas ideas respecto a esto de publicar documentación. Opino que la documentación que se publique debería ser de calidad y completa. Antes de convertirse en artículo debería ser expuesta ante la comunidad por si contiene errores o está incompleta. Así por ejemplo el tema de los menús estaba incompleto y a mi entender no debería estar allí. De hecho sigue incompleto porque acabo de aprender a hacer menus contextuales, pero aún no se manejar el tray icon y no si habrá cosas en las que no haya caído. Al fin y al cabo yo también estoy aprendiendo este lenguaje y hay cosas en las que me pierdo.
.
me dijerais si pensais que algún otro hilo mio merece pasar a la base de conocimientos o convertirse en artículo descargable. Hay algunos que podrían serlo, pero a mi entender están incompletos.

Luego si quereis borrais este hilo y en paz.

En fin que me gustaría una idea general de como plantear esto para tener un foro limpio, la documentación en su sitio y de calidad.

Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1693s (PHP: 25% SQL: 75%)
Consultas SQL: 26 - Debug off - GZIP Activado