Caracteristicas GeneXus que conviene conocer: Log de aplicaciones

 Las aplicaciones GeneXus, usan Log4Net, que es un biblioteca para el grabado y manejo de logs. 

Los programas GeneXus se ocupan de grabar log clasificando si es un error, warning, fatal, debug, info y log4net se encarga de grabarlo en los lugares que corresponda y filtrarlos en forma jerárquica. 

Tiene el concepto de jerarquía entre los mensajes

  • 0. OffThe OFF Level has the highest possible rank and is intended to turn off logging. This is the default value.
    1. FatalThe FATAL level designates very severe error events that will presumably lead the application to abort.
    2. ErrorThe ERROR level designates error events that might still allow the application to continue running.
    3. WarnThe WARN level designates potentially harmful situations.
    4. InfoThe INFO level designates informational messages that highlight the progress of the application at coarse-grained level.
    5. DebugThe DEBUG Level designates fine-grained informational events that are most useful to debug an application.
    6. AllThe ALL Level has the lowest possible rank and is intended to turn on all logging.


Los destinos del log, puede ser muchos y con GeneXus vienen pre-definidos

ConsoleAppender  (la salida es por la consola, es util para los command line)
ASPNetTraceAppender   (para verlo en la url con Trace.axd, en programas command line, es equivalente a Console)  
File   ( RollingFileAppender , para grabar archivos en el file system)
EventViewer (Graba en el Event Viewer)

Como se usa desde GeneXus ? 

En Genexus tenemos 3 propiedades a nivel del Generador C#, que permite elegir, cual son los limites del log que quiero tener. 
Hay 2, uno para el log de las clases standard de GeneXus (el rojo) y otro para el log de usuario (lo que se grabe con Log.Info, Log.Error, etc). 
 


La tercer propiedad es para identificar cual es el Appender que se va a usar. 

GeneXus genera varios archivos para esto: 

web.config   --- hace referencia a ---> log.config (archivo donde esta la configuración de log para el web)
client.exe.config --- hace referencia a --> log.console.config  (archivo donde esta la configuración del log para los programas command line). 

Los archivos se copian al directorio web y al directorio web\bin. 

De ahora en adelante, voy a hablar del log.console.config, pues es todo muy parecido para el otro archivo. 

Un ejemplo de este archivo: 


Como generar el log de usuario?. 
Se usa el Log y tiene varios métodos. 



Todos los métodos tienen una variable &Topic, que sirve para diferenciar una tipo de entrad. 
Si el log lo grabo con: 

Log.Error(&Texto,"Topic1")

va a ser capturado por el logger

 <logger name="GeneXusUserLog.Topic1" additivity="false">
     <level value="ALL" />
     <appender-ref  ref="RollingFile"/>
     <appender-ref  ref="ConsoleAppender"/>
</logger>

Como se podría usar esto?. Grabar solo un programa en forma específica. 
Suponiendo que toda nuestra aplicación, tenga el log grabado de la forma, en todos los programas de la aplicación. 

Log.Write(&Texto,&Pgmname,&LogLevel)  //Paso el nombre de programa como Topic. 

podríamos permitir capturar solo los mensajes de log de un programa CargarHoras

  <logger name="GeneXusUserLog" additivity="false">
    <level value="OFF" />
    <appender-ref  ref="ConsoleAppender"/>
 </logger>

   <logger name="GeneXusUserLog.CargarHoras" additivity="false">
     <level value="ALL" />
     <appender-ref  ref="RollingFile"/>
</logger>  

Es muy util para hacer debug en produccion, de un solo programa. Modificando el log.config, podríamos ver los mensajes de un programa. 

En java es parecido, pero tiene algunos detalles de configuracion diferentes. 

Comentarios

  1. lo malo de esto es que no maneja la opción de usar una tabla en la bd. yo no uso archivos, pues cuando esta en qa o producción monitoreamos por la tabla.

    ResponderBorrar
  2. Rodo, es relativamente sencillo hacerr que el log4net grabe en una base de datos.
    El problema es que es especifico para cada base de datos y lo otro, es que cuando hay problemas en la base de datos, los errores pueden no quedar registrados, pero es un mal menor.

    Podes mirar un ejemplo de como configurar log4net para que grabe en una tabla de SQLSErver en https://www.c-sharpcorner.com/article/configure-log4net-with-database-tutorial-for-beginners/

    Mas ejemplos de como configurarlo, con varias bases de datos en https://svn.apache.org/repos/asf/logging/log4net/tags/log4net-1_2_9/doc/release/config-examples.html#HC-17386824

    Tal vez se podria pedir a GX que lo traiga pre-configurado, como hoy lo hace con File, Trace o Console.

    ResponderBorrar
  3. Hola Enrique, ¿qué tal?
    Desarrollo con GX en Java-Oracle usando la Gx16 En adelante, como puedo ver cuáles son los SQL que realiza GX a la base de datos?

    Por ejemplo, al escribir esto en GX:

    For Each DATOS Order ID
    EndFor


    Necesito ver en alguna parte cual es el SQL de genexus:
    Select * from DATOS Order by ID

    Saludos!

    ResponderBorrar
    Respuestas
    1. En Java, en versiones mas nuevas (17 o 18) es mas facil generar el log de acceso a la base de datos. Solo tenes que cambiar la propiedad del generador
      Log JDBC Activity
      y a partir de ahi empieza a grabar en el log todo el dialogo con el servidor de base de datos.

      En versiones mas viejas, podes hacerlo como dice en el SAC https://www5.genexus.com/xev3/scmain.aspx?S%3B178%3B94%3B1264%3B1%3B1%3BO%3B,16033

      No recuerdo especificamente con GX16 como se hacia, pero de alguna de las dos formas te va a servir.

      Borrar
  4. Y una segunda consulta, existe un desarrollador NO Genexus que trabajaba solo en Java, se fue de la empresa y no dejo el código, existe alguna forma de saber cual es el SQL que genera la aplicación web al presionar por ejemplo un botón ?, algún software de DBA o algo similar??... Usando Toad, etc??

    Muchas gracias.

    ResponderBorrar
    Respuestas
    1. Hace tiempo que no administro Oracle, pero tiene tablas en la que podes ver las sesiones y las sentencias activas.

      SELECT s.sid, s.serial#, s.status, s.sql_id, q.sql_text
      FROM v$session s
      JOIN v$sql q ON s.sql_id = q.sql_id
      WHERE s.program LIKE '%nombre_de_la_aplicación%';

      Tambien podes habilitar el trace de una sesion y se va a generar un archivo de log con todo lo que hace esa sesion.

      Y podes investigar como se conecta la aplicacion a tu base de datos y generalmente los drivers tienen la posibilidad de habilitar un trace. Si usan JDBC es casi seguro de poder hacerlo.

      Con el TOAD no recuerdo como se hacia.

      Borrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.