• Publicidad

Ver logs en tiempo real

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Ver logs en tiempo real

Notapor jonhperl » 2010-07-21 19:36 @858

Saludos, tengo el problema que quiero ver un archivo access.log en tiempo real y uso el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "content-type: text/html \n\n";
  2.  
  3. print qq|
  4.  
  5. <html>
  6.  
  7.  <head>
  8.    <title>
  9.       Prueba de jQuery
  10.         </title>
  11.         <script src="jquery.js" type="text/javascript"></script>
  12.  
  13.  </head>
  14.  
  15.   <body>
  16. |;
  17.  
  18. print "Bienvenidos a mi script, si vemos este mensaje es porque funciona todo perfecto";
  19.  
  20. </script>';
  21. select(STDOUT);  $| = 1;        # Flush output after each print
  22.  
  23. print '<div id="resultadoConsulta"  style="width:600px; height:300px; overflow:auto;">';
  24.  
  25. open(LS,"/usr/bin/tail -f /var/log/access.log|");
  26. while ( $line = <LS>)
  27.    {
  28.         #print "$line<br>";
  29.         (@l) = split(/\s+/,$line);
  30.         chop($line);
  31.         $cad = $l[0]." ".$l[1]." ".$l[2]." ".$l[3]." ".$l[13];
  32.         $cad = $line;
  33.         print '<script language="JavaScript">$("#resultadoConsulta").prepend("'.$cad.'<br>")</script>';
  34.    }
  35. print "</div>";
  36. close(LS);
  37.  
  38. print qq|
  39. </body>
  40. </html>
  41. |;
  42.            
  43. exit(1);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que hace este script es que ejecuta el comando tail y cuando tiene una nueva línea la agrega al principio de un div. El problema es que como nunca acaba el proceso del comando tail, al cerrar la página se queda ejecutando el proceso y se van acumulando. La pregunta es que si hay otra forma más eficiente de ver los logs en tiempo real. Gracias por su atención

Atentamente, Jonh
jonhperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2010-07-21 19:22 @848

Publicidad

Re: Ver logs en tiempo real

Notapor explorer » 2010-07-21 19:55 @871

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

Efectivamente, ese es el problema: que el programa tail nunca regresa.

Una forma sencilla de hacerlo sería, primero, haciendo un $|=1; al principio del CGI para evitar que haya cacheo de la salida. Luego, en lugar de usar el comando tail del sistema, podrías usar el módulo File::Tail, que realiza la misma operación, pero te permite ejecutar tu código línea a línea nueva de access.log, que enviarás a la salida estándar.

Así, el CGI nunca termina, y envía una línea del access.log (o más de una si las hubiere) a la página.

Lo malo es que no se trataría de una página HTML normal, ya que nunca se terminaría de forma automática, sino que pararía por orden del usuario o por un timeout del servidor. Y además, no es compatible con todos los navegadores, que a veces esperan a que la conexión termine para representar toda la página.

Otra forma de hacerlo: cuando el usuario desea ver el access.log, lo pasas a una página HTML que tiene puesta la opción de autorefrescarse cada X segundos. El refresco consiste en llamar a un CGI, que genera una página con las últimas N líneas de access.log (también con la ayuda de tail -N, por ejemplo). La ventaja es que con esta solución no hay programas funcionando y terminas la conexión HTTP enseguida. La desventaja es que si hay mucho movimiento en access.log, el usuario puede perder la vista de algunas líneas. Esto último se puede resolver usando cookies o una query con fecha, en la URL.

Esto mismo se puede realizar en forma de Ajax, pero la única diferencia es en la parte de presentación, no la de servidor. Con CGI::Ajax también lo puedes hacer.
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


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado