Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Crear un log

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Jul 11, 2007 5:44 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Crear un log Responder citando

Buenos días,

Quiero hacer un log de todo lo que hace mi script, es decir, si ha contestado el ping si se ha podido descargar por FTP el fichero en concreto, si se ha borrado bien... En definitiva, todo lo que hago con el script.

He mirado y he encontrado el modulo Log::Handler pero no lo entiendo. Existe alguno más sencillo y que me sirva para registrar todo, si se ha hecho bien o si se ha hecho mal. Un saludo y gracias.
Mensaje Mie Jul 11, 2007 7:07 am
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 720
Ubicación: Buenos Aires
Responder citando

No creo que necesites un módulo, simplemente create un archivo de texto y haces

Perl:
open (LOG, ">> milog.txt");
print LOG "$mensaje\n";
close (LOG);


al hacer >> te va siempre añadiendo siempre una línea al final del archivo.

Saludos
Mensaje Mie Jul 11, 2007 7:55 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola:

Si buscas en CPAN por log encontrarás varios resultados que te ayudan a lograr justamente lo que quieres.

Por ejemplo, usando el módulo que dices, Log::Handler puedes hacer algo así:

Perl:
    use Log::Handler;

    my $log = Log::Handler->new( filename => 'log_perl.txt', mode => 'append' );

    open my $FILE, '<', "ejemplo.txt" or $log->emergency("No se pudo abrir archivo: $!");
    my @lines = <$FILE>;
    close $FILE or $log->warning("No se pudo cerrar el archivo: $!");




Saludos
Mensaje Mie Jul 11, 2007 8:21 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Nosotros usamos Log::Log4perl, pues nos parece que da la solución más profesional junto con un uso muy sencillo en los casos simples.

Ejemplo:
Perl:
use Log::Log4perl ':easy';            # Usamos las variables y funcionamiento 'fácil'

# Inicializamos el log
Log::Log4perl->easy_init($DEBUG);   # DEBUG, INFO, WARN, ERROR o FATAL : Nivel de detalle

# Empieza el programa
INFO "Comienzo del programa tal";

# ...

# Procesamiento
foreach my $var ( @todos ) {

    DEBUG "Procesando nodo $var";

    # ...

    if ( $desastre ) {
        LOGDIE "ERROR: Ejecución cancelada por error muy grave. Fin de programa";
    }

    if ( $error ) {
        WARN "ERROR en el procesamiento de $var. Se sigue con el siguiente";
        next;
    }

    # ...
}
INFO "Fin del programa tal";

La salida es algo parecido a esto:
Código:
2007/07/11 11:04:21 Comienzo del programa tal
2007/07/11 11:04:22 Iniciar conexión con Excel
2007/07/11 11:04:25 Ok
2007/07/11 11:04:25 Cargando plantilla Excel
2007/07/11 11:04:27 Ok
2007/07/11 11:09:23 Procesando nodo A
2007/07/11 11:35:26 Ok
2007/07/11 11:35:27 Cierra Excel
2007/07/11 11:35:33 Cerrando bases de datos
2007/07/11 11:35:38 Fin del programa tal

Eso es la salida en pantalla, pero es fácil desviar esa salida a un fichero (indicándoselo a Log::Log4perl). Los mensajes que aparecen son todos los asociados al nivel DEBUG (todas las líneas con DEBUG) y superiores. Si, después de la fase de corrección de errores, ya no quiero ver más esos mensajes de depuración, en la línea que inicializo Log::Log4perl lo cambio de $DEBUG a $INFO y de esa manera sólo saldrán los mensajes de nivel INFO o superior.

Incluso tiene funciones, como la LOGDIE que realizan una salida de un mensaje al log y luego terminan el programa (hacen un die, pero más amigable).

Esta configuración se puede realizar de forma externa con un fichero, con lo que podemos indicar, a todos (o parte) de los programas de nuestro proyecto el nivel de detalle, cómo es ese detalle (formato) y hacia dónde (pantalla, fichero, SMS, web, televisión, etc.)

Es muy cómodo, tanto si tienes un script pequeño como un programa muy grande. Total, son 2 líneas para empezar a trabajar y el resto son todas las líneas DEBUG, INFO, etc que quieras poner en tu programa.
Mensaje Jue Jul 12, 2007 3:54 am
aramallal
Perlero Nuevo
Perlero Nuevo
Registrado: 12 Jun 2007
Mensajes: 63
Responder citando

muchas gracias....
Mensaje Lun Jul 16, 2007 6:26 am
bloonix
Perlero Nuevo
Perlero Nuevo
Registrado: 16 Jul 2007
Mensajes: 1
Responder citando

Perl:
use Log::Handler;
use Sys::Hostname;

my $hostname =  hostname;
my $progname =  $0;
   $progname =~ s@.*[/\\]@@;

my $log = Log::Handler->new(
   filename => 'file.log',
   mode     => 'append',
   maxlevel => 'debug',
   minlevel => 'emergency',
   newline  => 1,
   prefix   => "[<--LEVEL-->] $progname: "
);

$SIG{__DIE__}  = sub { $log->trace(@_) && exit(9) };
$SIG{__WARN__} = sub { $log->warn(@_) };

# Empieza el programa
$log->info("Comienzo del programa tal");

# Procesamiento
foreach my $var ( @todos ) {

    $log->debug("Procesando nodo $var");

    # ...

    if ( $desastre ) {
        die "ERROR: Ejecución cancelada por error muy grave. Fin de programa";
    }   

    if ( $error ) {
        $log->error("ERROR en el procesamiento de $var. Se sigue con el siguiente");
        next;
    }   

    $log->debug("procesando nodo $var ok");

    # ...
}

$log->info("Fin del programa tal");


Código:
Jul 16 14:22:09 [INFO] test.pl: Comienzo del programa tal
Jul 16 14:22:09 [DEBUG] test.pl: Procesando nodo A
Jul 16 14:22:09 [DEBUG] test.pl: procesando nodo A ok
Jul 16 14:22:09 [DEBUG] test.pl: Procesando nodo B
Jul 16 14:22:09 [DEBUG] test.pl: procesando nodo B ok
Jul 16 14:22:09 [DEBUG] test.pl: Procesando nodo C
Jul 16 14:22:09 [DEBUG] test.pl: procesando nodo C ok
Jul 16 14:22:09 [INFO] test.pl: Fin del programa tal
Mensaje Mie Oct 03, 2007 10:44 am
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 149
Responder citando

Explorer,

Consulta:

Hay forma de dividir el procedimiento en pasos, digamos:
Proceso A: Hacer un ls
Proceso B: Hacer un ls del directorio /etc.

Así, si por algún motivo no funcionó algún comando saber en cuál estuvo el error.
Mensaje Mie Oct 03, 2007 10:55 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

El sistema de Log es independiente de los procesos. Quiero decir que un sistema de log es, principalmente, dependiente de un proceso principal y saca los mensajes que este proceso ordena.

Con Log::Log4perl es posible hacer que los procesos hijos hereden las propiedades de log del proceso padre. Así, es posible controlar el nivel de información que todo el sistema genera.

En cuanto a tu pregunta de si es posible dividir el procedimiento en pasos, naturalmente. Sólo tienes que hacer un DEBUG "Ejecutando proceso $tal"; al principio del bucle o de cada ejecución de procesos, para saber qué es lo que está haciendo.
Mensaje Mie Oct 03, 2007 11:03 am
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 149
Responder citando

Perdón por mi ignorancia pero no me estoy dando cuenta como hacerlo, estoy probando y la verdad que no obtengo un resultado positivo.
Tienes a mano algún ejemplo sencillo, así puedo verlo, digamos alguno donde ejecutes 2 procedimientos por lo menos.

Mucha Gracias
Mensaje Mie Oct 03, 2007 11:58 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Perl:
use Log::Log4perl ':easy';            # Usamos las variables y funcionamiento 'fácil'

# Inicializamos el log
Log::Log4perl->easy_init($DEBUG);   # DEBUG, INFO, WARN, ERROR o FATAL : Nivel de detalle

# Empieza el programa
INFO "Comienzo del programa A";
system("A");

INFO "Comienzo del programa B";
system("B");

INFO "Fin del programa principal";
Mensaje Mie Oct 03, 2007 3:12 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 149
Responder citando

Explorer muchas gracias :d
Mensaje Jue Oct 04, 2007 7:23 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 149
Responder citando

Consulta: cómo puedo hacer para guardar todo en una archivo de salida, digamos desde el aviso que comienza la ejecución, los procesos que corro y el final.

Probé metiendo
Perl:
open SALID "> reporte.txt";


pero no obtuve un resultado favorable :S
Mensaje Jue Oct 04, 2007 7:29 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4232
Ubicación: Valladolid, España
Responder citando

Log::Log4perl permite desviar la salida de pantalla a un fichero, pero para eso deberás consultar su documentación.

Otra cosa es la salida de los procesos. Se debería desviar el STDOUT y el STDERR antes de llamar a esos procesos, para redirigirlos a un fichero.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group