Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-01-2013
dario61081 dario61081 is offline
Registrado
 
Registrado: abr 2007
Posts: 6
Poder: 0
dario61081 Va por buen camino
Talking Monitor de eventos usando una clase

Buenas colegas. aqui tengo otra experiencia que quiero compartir con ustedes.

Para la mayoria de mis proyectos, necesito hacer un monitoreo de los eventos que sucede durante la ejecución. de esta forma puedo depurar mas los errores encontrados.

En esta oportunidad, mi clase monitoreo para ustedes.

Código Delphi [-]
type
  TMonitorLog = class
  private
    Fventana: tmemo;
    Fbolsa: tstringlist;
    procedure Setventana(const value: tmemo);
  public
    constructor create; overload;
    destructor destroy; overload;
    procedure evento(msg: string); // registrar un evento
    procedure volcar(archivo: string = '.\logs\eventos.log');
    property ventana: tmemo read Fventana write Setventana;
  end;

implements

{ TMonitor }

constructor TMonitorLog.create;
begin
  inherited;
  Fbolsa := tstringlist.create;
  Fbolsa.Add('Eventos: ' + datetimetostr(now));
end;

destructor TMonitorLog.destroy;
begin
  // self.volcar; //activar para un volcado a su destruccion.
  Fbolsa.Free; // liberar bolsa
  inherited;
end;

procedure TMonitorLog.evento(msg: string);
begin
  if assigned(Fventana) then
  begin
    Fventana.Lines.Add(msg);
    Fventana.Perform(EM_SCROLLCARET, SB_PAGEDOWN, 0);
    // auto deslise de la ventana
  end;
  Fbolsa.Add(msg);
end;

procedure TMonitorLog.Setventana(const value: tmemo);
begin
  Fventana := value;
  Fventana.Lines.Clear;
  Fventana.Lines.Add('Monitor de eventos: listo');
  fventana.ScrollBars := ssVertical;
end;

procedure TMonitorLog.volcar(archivo: string);
begin

  Fbolsa.SaveToFile(archivo);
  Fbolsa.Add('volcado ok');
  if assigned(Fventana) then
    Fventana.Lines.Add('volcado ok');

end;

Desde ya, gracias por la atencion.

saludos cordiales.
Responder Con Cita
  #2  
Antiguo 25-01-2013
Avatar de gmontes
gmontes gmontes is offline
Miembro
 
Registrado: jul 2004
Ubicación: Culiacán, Sinaloa, México
Posts: 637
Poder: 14
gmontes Va por buen camino
muy interesante , y como lo aplicas?? perdona mi ignorancia
__________________
Todos llevamos nuestros demonios a cuestas..
Responder Con Cita
  #3  
Antiguo 08-02-2013
Avatar de Cristhor1982
Cristhor1982 Cristhor1982 is offline
Miembro
 
Registrado: dic 2012
Posts: 60
Poder: 6
Cristhor1982 Va por buen camino
Hola, me podrias explicar como utilizar este log de eventos, por favor


Gracias
Responder Con Cita
  #4  
Antiguo 08-02-2013
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.429
Poder: 18
mamcx Va camino a la famamamcx Va camino a la fama
Tener una forma de logear eventos es algo critico en una aplicacion. Desde hace un par de años he implementado la practica y es algo muy bueno en especial para detectar post-morten que paso con un error o problema.

Hay varias opciones en Delphi:

http://stackoverflow.com/questions/8...age-for-delphi

http://stackoverflow.com/questions/7...rary-is-better

Esta opcion open source de Synapse parece buena

http://blog.synopse.info/post/2011/0...-in-SynCommons

La idea es que insertas miles y miles de llamadas al log (si: Cuando logeas, mas es mejor!. Solo hay que tener cuidado a la hora de invocar funciones con efectos colaterales que pudieran corromper las cosas ie: No invocar una insercion en BD, modificacion archivos, etc)

Código Delphi [-]
procedure TMyDB.SQLExecute(const SQL: RawUTF8);
var ILog: ISynLog;
begin
  ILog := TSynLogDB.Enter(self,'SQLExecute');
  // do some stuff
  ILog.Log(sllInfo,'SQL=%',[sql]);
end; // when you leave the method, it will write the corresponding event to the log

Resultado:

Código PHP:
20110325 19325801  +    MyDBUnit.TMyDB(004E11F4).SQLExecute
20110325 19325801 info   SQL
=SELECT FROM Table;
20110325 19325801  -    MyDBUnit.TMyDB(004E11F4).SQLExecute 
Ahora bien, el siguiente problema es como rayos examinar esos logs. Porque se vuelven grandes. Y como hacer para leer los logs sin ir a cada cliente y abrir los archivos locales. Para eso hay servicios como http://loggly.com/ que permtien enviar por APIs el log a un servidor central y usarlo como un visor global de TODOS los logs.

Luego de experimentar mucho, he llegado a un estilo que me permite injectar multiples logeadores y notificadores (por ejemplo, tengo llamadas a un servicio que me guarda la info de desempeño, memoria, CPU del codigo para ver si la APP esta corriendo por debajo de lo usual, y otros sensores de datos).

Lo que he hecho es tener una libreria llamada "notify" que me encapsula todo. Esta en python, pero la idea es masomenos:

Notificador por GROWL, que puede o no estar instalado
Código PHP:
growl gntp.notifier.GrowlNotifier(
    
applicationName=settings.APP_NAME,
    
notifications = ["Teleport"],
    
defaultNotifications = ["Teleport"],
    
# hostname = "computer.example.com", # Defaults to localhost
    # password = "abc123" # Defaults to a blank password
)

try:
    
growl.register()
except Exceptione:
    
growl None

def sendGrowl
(titledescription=Noneicon=None):
    if 
growl:
        
growl.notify(
            
noteType="Teleport",
            
title=title,
            
description=description,
            
icon=icon,
        )
    else:
        print 
"Growl not available: %s" title 
Logeo de eventos:

Código PHP:
def debug(text, *args, **kwargs):
    
log.debug(text, *args, **kwargs)


def info(text, *args, **kwargs):
    
log.info(text, *args, **kwargs)


def warning(text, *args, **kwargs):
    
log.warning(text, *args, **kwargs)


def error(excsilent=False, *args, **kwargs):
    
log.exception(exc, *args, **kwargs)

    
sendGrowl(title='Error in teleport'description=exc.message)
    if 
not silent:
        
raise
    
#raise 
Y envio el log al servidor remoto:

Código PHP:
class LoggyHandler(logging.Handler):
    
def __init__(self):
        
logging.Handler.__init__(self)

    
def emit(selfrecord):
        
self.format(record)

        try:
            if 
not settings.DEBUG:
                
requests.post(settings.LOGGYs)
        
except Exception:
            
pass  # Ignorar errores al enviar log. La app debe seguir siempre, no fallar si el servicio de terceros tiene problemas 
Y sensor (invoca un servicio web, asincronicamente. Si falla? Se pierde el dato pero la app sigue):

Código PHP:
def requestTimeNumber(num):
    
dash sensor()
    
dash.pushNumber("requestTime"num
Y luego lo extiendes a mandar correos y mas cosas.

Es mucho mas centralizado de lo que muestro, es para que quede mas claro la idea. Eso quiere decir que cuando llamo:

Código PHP:
notify.error(err,silent=False
Pasa lo siguiente:

1- Se va el error a la consola DOS/terminal *nix (si la app corre en consola)
2- Se guarda en un archivo log, que se rota cada 7 dias
3- Se envia (si es posible) el error a loggy
4- Se notifica por email al usuario que el servidor a fallado (porque puede que el servidor este en un equipo lejano)
5- Se envia por growl el error (si esta instalado, por ejemplo, se corre la app en la maquina del usuario, no tienen equipo servidor aparte)
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #5  
Antiguo 08-02-2013
Avatar de gmontes
gmontes gmontes is offline
Miembro
 
Registrado: jul 2004
Ubicación: Culiacán, Sinaloa, México
Posts: 637
Poder: 14
gmontes Va por buen camino
gracias por la explicacion,
__________________
Todos llevamos nuestros demonios a cuestas..
Responder Con Cita
  #6  
Antiguo 08-02-2013
Avatar de Cristhor1982
Cristhor1982 Cristhor1982 is offline
Miembro
 
Registrado: dic 2012
Posts: 60
Poder: 6
Cristhor1982 Va por buen camino
Si, gracias...ahora me daré de cabezazos para tratar de entender un poco!!

Gracias
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar mi clase a una clase de 3 capas o lo mas parecido elarys OOP 2 08-04-2011 00:02:54
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 12:26:55
Crear eventos para una clase DarkByte OOP 10 07-12-2005 21:02:28
Dudas usando la clase TStringList blamsa Varios 6 27-05-2005 17:50:48
Controlar eventos de una clase propia keglevich OOP 4 15-09-2004 14:58:21


La franja horaria es GMT +2. Ahora son las 01:23:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi