Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 08-02-2013
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
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)
__________________
El malabarista.
Responder Con Cita
 



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 07-04-2011 23:02:54
clase que contiene otra clase definida de forma posterior astwin OOP 5 20-02-2009 11:26:55
Crear eventos para una clase DarkByte OOP 10 07-12-2005 20:02:28
Dudas usando la clase TStringList blamsa Varios 6 27-05-2005 16:50:48
Controlar eventos de una clase propia keglevich OOP 4 15-09-2004 13:58:21


La franja horaria es GMT +2. Ahora son las 16:57:15.


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