Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Creación De Logs Para Aplicaciones Profesionales
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 %.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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".
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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/
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Ideas Para La Creación De Otros Retos Shell Retos de programación 0 Domingo, 05 Octobre 2014, 20:23 Ver último mensaje
Shell
No hay nuevos mensajes Creación De Un Foro Para Mensajes Muy Imp... Shell Sobre Gambas-es 7 Lunes, 07 Septiembre 2015, 09:55 Ver último mensaje
Shell
No hay nuevos mensajes Logs Del Sistema Linux. Shell Mundo Linux 0 Jueves, 18 Octobre 2018, 13:55 Ver último mensaje
Shell
No hay nuevos mensajes Aplicaciones Profesionales. Controlando La... shordi Aplicaciones/Fragmentos de Código 17 Lunes, 29 Julio 2019, 18:52 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron