• Publicidad

Historificación de Logs

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Historificación de Logs

Notapor aprendizGC » 2016-08-31 04:30 @229

Buenos días a todos.

Estoy intentando realizar un script que me historifique los ficheros de registro que mi proceso va creando.

Resulta que tengo un productor y un consumidor, y los dos van escribiendo en el fichero que se crea por día, con el siguiente formato: aaaa_mm_dd_Log.txt.

El problema me surge a la hora de cambiar de día. El productor cambia la escritura al fichero correspondiente, pero el consumidor sigue escribiendo en el fichero del día anterior.

La forma en la que lo estoy haciendo es la siguiente:

1- Una función de escritura en log:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Escribir_Log()
  2. {
  3.         # Recogida de la ristra
  4.         my ($ristraLog) = @_;
  5.  
  6.         my ($fechaHora, $fecha, $hora) = &fechaHora();
  7.         my $aux_nombre_fichero_Log = $fecha.$nombre_fichero_Log;
  8.  
  9.         printf $fichLog $aux_nombre_fichero_Log;
  10.  
  11.         if( ! (-e ($path.$aux_nombre_fichero_Log)) )
  12.         {
  13.                 &Abrir_Fichero_Log();          
  14.         }
  15.  
  16.  
  17.         if( ($fichLog != undef) && ((length $ristraLog) > 0) )
  18.         {
  19.                 #flock(\*$fichLog, LOCK_EX);        # solicitamos el bloqueo, y de forma esclusiva
  20.                 #seek(\*$fichLog, 0, SEEK_END);     # nos colocamos al final del archivo
  21.                 #my ($fechaHora,$fecha,$hora) = &fechaHora();
  22.                 #$ristraLog = $hora.$ristraLog;
  23.                 #print $fichLog $ristraLog;                # se escribe en el fichero.
  24.                 #flock(\*$fichLog, LOCK_UN);        # desbloqueamos el acceso
  25.  
  26.                 flock(\*$fichLog, LOCK_EX) or die $!;        # solicitamos el bloqueo, y de forma esclusiva
  27.                 # flock(\*$fichLog, LOCK_EX);        # solicitamos el bloqueo, y de forma esclusiva
  28.                 seek(\*$fichLog, 0, SEEK_END) or die $!;     # nos colocamos al final del archivo
  29.                 # seek(\*$fichLog, 0, SEEK_END);     # nos colocamos al final del archivo
  30.                 my ($fechaHora,$fecha,$hora) = &fechaHora();
  31.                 $ristraLog = $hora.$ristraLog;
  32.                 print $fichLog $ristraLog;                                       # se escribe en el fichero.
  33.                 flock(\*$fichLog, LOCK_UN) or die $!;        # desbloqueamos el acceso
  34.                 #flock(\*$fichLog, LOCK_UN);        # desbloqueamos el acceso
  35.         }
  36.  
  37. } # Fin Escribir_Log
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Y 2- la función de apertura del fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Abrir_Fichero_Log()
  2. {
  3.         my ($fechaHora, $fecha, $hora) = &fechaHora();
  4.         my $aux_nombre_fichero_Log = $fecha.$nombre_fichero_Log;
  5.  
  6.         #if( ! (-e ($path.$aux_nombre_fichero_Log)) )
  7.         #{
  8.                 # Si existía alguno abierto, se cierra y se abre otro
  9.         #       if($fichLog != undef)
  10.         #       {
  11.                         # NOTA: No se utiliza el bloqueo porque al intentar desbloquear, después de cerrar, da error porque
  12.                         #               pone la variable "fichLog" como undef, incluso antes de llegar a la asignación a pelo.
  13.         #               flock(\*$fichLog, LOCK_EX);
  14.         #               close($fichLog);
  15.         #               $fichLog = undef;
  16.         #       }
  17.         #}
  18.         # Se abre el nuevo
  19.  
  20.         #if($fichLog != undef)
  21.         #{
  22.         #       flock(\*$fichLog, LOCK_EX);
  23.         #}
  24.  
  25.         #open($fichLog, ">>$aux_nombre_fichero_Log");
  26.         #seek(\*$fichLog, 0, SEEK_END);
  27.  
  28.         #if($fichLog != undef)
  29.         #{
  30.         #       flock(\*$fichLog, LOCK_UN);
  31.         #}
  32.  
  33.         #printf $fichLog $fechaHora."Inicio Log::v1\n";
  34.  
  35.         #printf $fichLog $aux_nombre_fichero_Log;
  36.  
  37.  
  38.         # 2016-08-31
  39.         #flock(\*$fichLog, LOCK_EX);
  40.         open($fichLog, ">>$aux_nombre_fichero_Log");
  41.         #flock(\*$fichLog, LOCK_UN);
  42.  
  43.         printf $fichLog $fechaHora."Inicio Log::v1\n";
  44.  
  45.         printf $fichLog $aux_nombre_fichero_Log;
  46. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Les estaría agradecido si me ayudaran a ver dónde está el error.

Gracias.
aprendizGC
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-08-31 04:09 @214

Publicidad

Re: Historificación de Logs

Notapor explorer » 2016-08-31 15:25 @684

Bienvenido a los foros de Perl en Español, aprendizGC.

Creo que la línea 9 del primer código debería estar en la 15, para que ese print se realice en el nuevo archivo.

De todas maneras... yo lo que haría sería hacer un close del archivo, dentro de Abrir_Fichero_Log().

Por ejemplo, hacer un if() para ver si if(defined $fichLog), y en ese caso hacer un close $fichLog, antes de abrir el nuevo archivo.

No sé... lo veo un pelín lioso.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Historificación de Logs

Notapor aprendizGC » 2016-09-05 04:01 @209

Buenos días, explorer, y muchas gracias por la bienvenida, y por la respuesta rápida...

Voy a probar la solución que indicas... aún así, ¿cuál sería otra solución viable?

Gracias.

Saludos.
aprendizGC
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-08-31 04:09 @214

Re: Historificación de Logs

Notapor explorer » 2016-09-05 16:55 @747

Es que aún no lo veo claro... Cuando hablas de productos y consumidor, ¿te refieres a dos procesos distintos o a dos métodos o subrutinas del mismo proceso?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Historificación de Logs

Notapor aprendizGC » 2016-09-06 04:02 @210

Buenos días:

Me refiero al problema típico de concurrencia de productor/consumidor.

Lo que he hecho ha sido crear dos hilos:

threads->create(\&PRODUCTOR);
threads->create(\&CONSUMIDOR);

Y mi intención es que los dos escriban en el mismo fichero, y para ello, utilizar las funciones de acceso restringido a los ficheros.
Pero no está funcionando.

No entiendo por qué el consumidor incluso con el nombre del fichero correcto, cambiándolo de día incluso, no escribe en el fichero correcto.

Entre ayer y hoy, día 05 y día 06, el productor creó el fichero "2016-09-06" con esta entrada "2016/09/06 00:00:09 Inicio Log::v1"

El consumidor, ejecutando la función "Escribir_Log", debería realizar la comprobación de la existencia del fichero, y debería ser verdadera.
Pero no sé por qué el consumidor sigue escribiendo en el fichero del día "2016-09-05".

¿Puede ser porque aunque el productor cierre el fichero, para el consumidor continúe abierto?

Gracias.

Saludos.
aprendizGC
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2016-08-31 04:09 @214

Re: Historificación de Logs

Notapor explorer » 2016-09-09 14:42 @654

Si los hilos no comparten el filehandle, entonces cada uno mantiene su propia conexión con el archivo abierto, así que sí: cada uno debe abrirlo y cerrarlo por separado.

Otra cosa es que los hilos compartan el filehandle. En ese caso, si se comparte la variable entre los hilos, uno de ellos se puede encargar de abrirlo y cerrarlo, y el otro solo tiene que preguntar si el filehandle es válido antes de imprimir nada hacia él.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron