Página 1 de 1

Historificación de Logs

NotaPublicado: 2016-08-31 04:30 @229
por aprendizGC
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.

Re: Historificación de Logs

NotaPublicado: 2016-08-31 15:25 @684
por explorer
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.

Re: Historificación de Logs

NotaPublicado: 2016-09-05 04:01 @209
por aprendizGC
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.

Re: Historificación de Logs

NotaPublicado: 2016-09-05 16:55 @747
por explorer
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?

Re: Historificación de Logs

NotaPublicado: 2016-09-06 04:02 @210
por aprendizGC
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.

Re: Historificación de Logs

NotaPublicado: 2016-09-09 14:42 @654
por explorer
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.