wiki:logTiempoReal

Version 2 (modified by irina, 11 years ago) (diff)

--

Cómo mostrar los mensajes de log en tiempo real

Un script tiene varios pasos, voy mandando mensajes de lo que se está realizando y en algunas tareas me interesa mostrar la salida que da el comando al que llamo.

La página de log en tiempo real nos muestra cuatro espacios con informaciones diferentes. Los mensajes de log del script se van acumulando en la zona intermedia y la salida del comando se muestra en la parte baja.

Partes de la consola de log en tiempo real.

Cada una de las zonas toma como punto de partida un archivo de log que se guarda en el directorio /tmp del cliente. Nos interesan las dos últimas.

Archivo Variable Zona
/tmp/session.log OGLOGSESSION Pasos del script
/tmp/command.log OGLOGCOMMAND Salida comando.

Además tenemos:

Archivo Variable Función
/opt/opengnsys/log/IP_client.log OGLOGFILE Archivo de log histórico que guarda el servidor
/tmp/command.log.tmp -- Se obtiene aplicando el comando string a command.log

Al comenzar un script borramos los archivos que se muestra en la pantalla.

En el caso que un script sea una subtarea que es llamada por otro script, conviene no borrar el script session.log. Por ejemplo si el script de deployImage llama a updateCache no me interesa borrar los pasos que se hayan hecho anteriormente pero sí la salida concreta del comando. En el código tendré:

# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
echo " " > $OGLOGCOMMAND 
[ "$(ogGetCaller)" == "deployImage" ] || echo -n "" > $OGLOGSESSION; 

Los mensajes que quiero que salgan en la parte de los intermedia los monstraré así:

echo “Mensaje de log” | tee -a $OGLOGSESSION $OGLOGFILE

La salida de los comandos se redireccionan así:

ogCopyFile REPO imagen.img CACHE /  2>&1 | tee -a $OGLOGCOMMAND

Cuando quiero mostrar la salida de un error y salirme después:

ComandoAComprobar
[ $? == 0 ] || ogRaiseError $OG_ERR_XXX "paramentros" 2>&1 | tee -a $OGLOGSESSION $OGLOGFILE 
exit ${PIPESTATUS[0]}

Los errores definidos en opengnsys los podemos encontrar en /opt/opengnsys/client/etc/preinit/loadenviron.sh

No conviene redireccionar hacía OGLOGCOMMAND la salida de los comandos/script que en su codigo interno envíen mensajes a OGLOGSESSION, para no duplicar los mensajes. Por ejemplo su desde el script deployImage llamo a updateCache y lo redirecciono a la salida de comandos.

updateCache 2>&1 | tee -a $OGLOGCOMMAND

Como update cache en su codigo interno manda mensajes a OGLOGSESSION estos se verán duplicados en las dos partes de la pantalla.

Código de la página de log en tiempo real.

La página del cliente que se encarga de mostrar el log de tiempo real es: /usr/lib/cgi-bin/httpd-log.sh

#!/bin/bash 
echo "Content-type: text/html" 
echo "" 
#echo "<html><head><meta http-equiv='Refresh' content='2,URL=./example3.sh'><title>Bash as CGI" 
echo "<html><head><title>OpenGnsys Client</title></head><body>" 

echo "<h1> $(./httpd-runengine.sh 'ogEcho $MSG_HTTPLOG_NOUSE'  ) .</br>host $(hostname -s)</h1> " 

echo "<IFRAME SRC='bandwidth.sh' WIDTH=250 HEIGHT=90> <A HREF="bandwidth.sh">link</A> </IFRAME> " 
echo "<IFRAME SRC='cache.sh'     WIDTH=590 HEIGHT=90><A HREF="cache.sh">link</a> </IFRAME><br>" 

echo "<IFRAME SRC='LogSession.sh' WIDTH=850 HEIGHT=230> <A HREF="LogSession.sh">link</A> </IFRAME>" 
echo "<IFRAME SRC='LogCommand.sh' WIDTH=850 HEIGHT=280> <A HREF="LogCommand.sh">link</A> </IFRAME>" 

De las distintas partes de la pantalla se encargan los script:

Mostramos las líneas de estos script que nos pueden interesar:

bandwidth.sh

<meta http-equiv='Refresh' content='11,URL=./bandwidth.sh'>
echo "  DISK     ||   NET " 
echo "Read:Write || Recv:Send " 
echo $(tail -n1  /tmp/bandwidth) 

cache.sh

$(ls -lh /opt/opengnsys/cache/opt/opengnsys/images )"

LogSession.sh

<meta http-equiv='Refresh' content='5,URL=./LogSession.sh'>
echo "$(cat /tmp/session.log | uniq )"

LogCommand.sh

$(strings /tmp/command.log > /tmp/command.log.tmp) 
...
NAME='trackloghead'
echo "$(egrep -v '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes\|^\[' /tmp/command.log.tmp | uniq | head -n 15)" 
...
NAME='tracklogtail'
echo "$(egrep '%|sent|^Elapsed:\|^Total [Tt]ime:\|^-\|^|\|^bytes' /tmp/command.log.tmp | uniq | tail -n 2)"

Observamos que para mostrar la progresión del comando se filtra su salida con egrep, si algún comando no mostrará nada habría que revisar los patrones que se le pasan.

Attachments (1)

Download all attachments as: .zip