Mie Jul 11, 2007 5:44 am
|
 |
aramallal
Perlero Nuevo

|
Registrado: 12 Jun 2007
Mensajes: 63
|
|
| Crear un log |
|
|
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. |
|
|
|
Mie Jul 11, 2007 7:07 am
|
 |
monoswim
Vive para Perl en Español

|
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
|
|
|
|
|
No creo que necesites un módulo, simplemente create un archivo de texto y haces
al hacer >> te va siempre añadiendo siempre una línea al final del archivo.
Saludos |
|
Mie Jul 11, 2007 7:55 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|

Mie Jul 11, 2007 8:21 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4104
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Jue Jul 12, 2007 3:54 am
|
 |
aramallal
Perlero Nuevo

|
Registrado: 12 Jun 2007
Mensajes: 63
|
|
|
|
|
| muchas gracias.... |
|

Lun Jul 16, 2007 6:26 am
|
 |
bloonix
Perlero Nuevo

|
Registrado: 16 Jul 2007
Mensajes: 1
|
|
|
|
|
| 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 |
|
|

Mie Oct 03, 2007 10:44 am
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 143
|
|
|
|
|
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. |
|

Mie Oct 03, 2007 10:55 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4104
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Mie Oct 03, 2007 11:03 am
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 143
|
|
|
|
|
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 |
|
Mie Oct 03, 2007 11:58 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4104
Ubicación: Valladolid, España
|
|
|
|
|
| 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"; |
|
|
Mie Oct 03, 2007 3:12 pm
|
 |
situ
Perlero Frecuente

|
Registrado: 09 Abr 2007
Mensajes: 143
|
|
|
|
|
| Explorer muchas gracias :d |
|
Jue Oct 04, 2007 7:29 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4104
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|