• Publicidad

Crear un log

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Crear un log

Notapor aramallal » 2007-07-11 06:44 @322

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.
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Publicidad

Notapor monoswim » 2007-07-11 08:07 @379

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (LOG, ">> milog.txt");
print LOG "$mensaje\n";
close (LOG);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor kidd » 2007-07-11 08:55 @413

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í:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    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: $!");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4




Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2007-07-11 09:21 @431

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La salida es algo parecido a esto:
Código: Seleccionar todo
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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor aramallal » 2007-07-12 04:54 @246

muchas gracias....
aramallal
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2007-06-12 06:29 @312

Notapor bloonix » 2007-07-16 07:26 @351

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Código: Seleccionar todo
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
bloonix
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2007-07-16 06:57 @331

Notapor situ » 2007-10-03 11:44 @530

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.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2007-10-03 11:55 @538

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor situ » 2007-10-03 12:03 @544

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
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2007-10-03 12:58 @582

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
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";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados