Página 1 de 1

Lectura de un archivo que crece...

NotaPublicado: 2005-10-27 11:56 @538
por reggiebcn
Hola, desearia poder leer un archivo que está en continuo crecimiento, basicamente un log, y que cada vez me lo lea desde el último punto donde lo leí.
Creo que existe el módulo File::Tail para ello, aunque no se bien bien como funciona, pero vi una vez un comando en un script hecho en Perl que servía para eso.

Alguien me podria echar una mano??

Gracias de anetmano ^_^

File::Tail

NotaPublicado: 2005-10-27 13:01 @584
por explorer39
Un ejemplo:
Código: Seleccionar todo
use File::Tail;
use strict;

my $name = '/var/log/mail.log';
my $file = File::Tail->new(name=>$name,tail=>50);
my $cada = 20;
my $line;

while ( defined( $line = $file->read ))
{
    # Aqui trabajamos con la linea $line
}


Documentación del File::Tail.
Este módulo hace "polling" sobre el fichero, es decir, está mirando constantemente, cada x segundos, si el fichero ha crecido.
Otra opción es el nuevo módulo File::Tail::FAM que es llamado por el kernel cuando el fichero cambia. De esa manera tu programa no consume ciclos de procesador inútiles.

NotaPublicado: 2005-10-28 10:11 @466
por reggiebcn
Uhm....pero creo que a mi eso no me sirve.
Por ejemplo, yo ejecuto mi script hoy y me lee el fichero log. VUelvo a ejectuar el script dentro de 3 dias, y solo quiero que me lea lo que se ha añadido en el log.
Con File::Tail entonces no puedo hacerlo, no?

NotaPublicado: 2005-10-28 10:36 @483
por monoswim
Y si guardás la pocisión del EOF en un archivo txt o el nro de línea y luego empezás a leer desde ahí ???

Saludos

NotaPublicado: 2005-10-28 10:42 @487
por reggiebcn
Y como puedo guardar el EOF o numero de linea?

NotaPublicado: 2005-10-28 11:56 @539
por explorer39
El tamaño del fichero: -s $fichero.

NotaPublicado: 2005-10-28 11:58 @540
por reggiebcn
i como uso el tamaño del fichero?

NotaPublicado: 2005-10-28 12:33 @565
por explorer39
Primero procesas el fichero una vez, todas las líneas. Luego, almacenas su tamaño (-s) en algún lugar persistente (otro fichero, una base de datos, etc. etc.). En la próxima ejecución de tu script, lo primero que harás será un seek según ese valor. De esa forma, el puntero de lectura pasará al siguiente carácter no leído.
Puedes hacer más comprobaciones, como que el fichero no haya crecido hasta entonces, por ejemplo.
Si el fichero tiene alguna estructura especial, entonces no te hace falta hacer nada de esto.
Por ejemplo. Si es un fichero de un registro de actividad, que está dividido cada línea en campos y uno de ellos es la fecha, pues entonces sólo tienes que recordar esa fecha para la próxima vez que lo vuelvas a leer.