FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
Tail -f en delphi
Buenas,
Aunque llevaba bastante tiempo sin programar ya en delphi, mi jefe me ha pedido que me ponga el mono de trabajo de nuevo :-) Estoy un poco pegao con lo que tengo que hacer y es por lo que busco vuestra ayuda. Se trata de lo siguiente: Debo hacer un programa que inspeccione un archivo de log abierto por otra aplicación y al que ésta última le esta añadiendo líneas contínuamente (hay rotación de logs diaria). Por cada línea debo realizar un análisis por temas de seguridad. No se muy bien por donde empezar. Me podeis echar una mano por favor? Muchas gracias |
#2
|
||||
|
||||
Hola paquechu.
Si tenes acceso al código fuente de la aplicación que genera el archivo (log), podes enviar la última línea generada mediante la estructura COPYDATASTRUCT y luego capturar el mensaje WM_COPYDATA desde la aplicación que monitorea. En estos enlaces tenes algunos ejemplos:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Hola ecfisa,
Pues lo cierto es que no tengo acceso al codigo de la aplicación. Se trata de logs generados en formato texto por un servidor ISA Server de Microsoft. Debo localizar el archivo, abrirlo y empezar a leer desde el final línea a línea... Saludos y gracias :-) |
#4
|
||||
|
||||
Hola paquechu.
Entonces, en principio depende de con que "sharing options" haya abierto el archivo la otra aplicacion. ¿ Ya intentaste abrirlo para lectura, estando activa la aplicación generadora y te mostró algún error ? Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 22-03-2013 a las 03:31:40. |
#5
|
|||
|
|||
Hola de nuevo,
Pues no, la verdad es que no se muy bien como enfocarlo, más que por el modo en el que está abierto el archivo por como leer el archivo que se está alimentando constantemente por otra aplicación y gestionar esas entradas en vivo. Saludos. |
#6
|
||||
|
||||
Hola paquechu.
Para leer el archivo de texto podes hacer: 1)
2)
Un ejemplo que devuelve la última línea del archivo log: De este modo es mucho mas rápido que leer todo el archivo si te decidis por obtener datos con, por ejemplo, un TTimer. Pero el último código es sólo una aproximación, con muchos supuestos, podría funcionar o no dependiendo del formato con que guarda las líneas la aplicación. Sería muy útil si pudieras poner textualmente (copiar/pegar) un trozo del texto que se genera en el archivo log. Ahora si lo que estas buscando es obtener la última línea en tiempo real y la aplicación generadora no envía ningún mensaje cuando terminó de guardar una línea, no conozco como lograrlo. Espero que alguna opción te sea útil. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#7
|
||||
|
||||
He echado una mirada en como se hace en python:
http://code.activestate.com/recipes/...l-f-in-python/ y veo que es necesario ademas usar sleep (muy corto) para poder leer de forma continua.
__________________
El malabarista. |
#8
|
|||
|
|||
Hola ecfisa,
Si, conocia los metodos señalados en los puntos 1 y 2. Mi consulta va mas en la línea de lo que indicas en el punto 3, en la parte de identificar cuando se genera una nueva línea en el archivo (en tiempo real) y entonces leer la linea completa y procesarla. Es un buen comienzo el que me indicas asi que empezaré por ahí :-) Gracias ecfisa. |
#9
|
|||
|
|||
Hola mamcx,
tomo nota del retardo necesario aunque de phyton no tengo ni papa, je,je Al final de la pagina que referencias aparece este codigo, si controlas delphy y phyton podrias orientarme en la adaptación del código?: Muchas gracias. def tail_f(file): interval = 1.0 while True: where = file.tell() line = file.readline() if not line: time.sleep(interval) file.seek(where) else: yield line Which then allows you to write code like: for line in tail_f(open(sys.argv[1])): print line, |
#10
|
||||
|
||||
paquechu,
Cita:
El código anterior lee de forma continua por medio de un control TTimer cada 100 ms la última línea de un archivo de texto y la adiciona a un control TListBox para su posterior procesamiento. Nota: Este código fue probado con un archivo de texto de 2.000.000 de líneas de forma satisfactoria. Espero sea útil Nelson. Última edición por nlsgarcia fecha: 23-03-2013 a las 03:26:08. |
#11
|
||||
|
||||
Seria bueno almacenar cuantas lineas habian en la lectura anterior y luego restarlas, porque un log puede recibir varias lineas nuevas mientras esta el timer esperando.
__________________
El malabarista. |
#12
|
|||
|
|||
Vaya!, perdonad, estaba enfrascado con el tema de marras todo este tiempo....
Le he echado un vistazo al código. Dices que puedes cargar 2.000.000 de lineas en el tstringlist, aunque no se el tamaño maximo (no de lineas) sino de memoria que se puede cargar con un tstringlist. Lo voy a probar, me preocupa el tiempo de carga y el consumo excesivo de memoria. Muchas gracias :-) |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|