Actualmente lo estoy usando tail -f
para ver registros.
¿Existe alguna forma más eficiente, legible o mejor de ver los registros?
Respuesta1
¡Sí! perl
representarLenguaje práctico de extracción e investigación..
En lugar de utilizar shell
sintaxis, como:
tail -f file | grep --line-buffered someting
o
tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'
(Nota: --line-buffered
en grep
, como -u
en sed
son útiles para preveniralmacenamiento en búfer mediante bloques de tamaño fijo)
Para ver/explorar registros, perl
eselidioma.
Dependiendo delo que estás esperando...Es posible que tengas que crear un pequeño script que se ajuste exactamente a tus necesidades.
Es posible que encuentre algunas muestras útiles en perlfaq, como en perldoc perlfaq5
(o man perlfaq5
si no lo ha instalado perldoc
), hay una pregunta:¿Cómo hago una "cola -f" en Perl?donde he tomado esto:
Primer intento
seek(GWFILE, 0, 1);
La declaración
seek(GWFILE, 0, 1)
no cambia la posición actual, pero sí borra la condición de fin de archivo en el identificador, de modo que la siguiente<GWFILE>
hace que Perl intente leer algo nuevamente.Si eso no funciona (depende de las características de su implementación stdio), entonces necesita algo más como esto:
for (;;) { for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) { # search for some stuff and put it into files } # sleep for a while seek(GWFILE, $curpos, 0); # seek to where we had been }
Ya he usado esto muchas veces para activar casos especiales.
MANIFESTACIÓN
Para muestra, hay unquick and dirty
contador de registros en tiempo real¡intentalo! (necesita acceso de lectura a /var/log/syslog
;-):
#!/usr/bin/perl -w
my %counter;
open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );
for ( ; ; ) {
for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
$counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
}
syswrite STDOUT, sprintf "\r%s\e[K",
join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
select undef,undef,undef,1;
seek( FH, $curpos, 0 );
}
Produciría una línea, que se actualizaría automáticamente cada segundo, y contendría todo lo visto.demonioel nombre y un contador para cada uno de ellos:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
Respuesta2
Como sugiere F. Hauri, podrías usar Perl para formatear la salida.
Para mi uso, creé un alias para tail en mi ~/.bashrc
para leer los registros de Glassfish. Es muy simple (una línea) y colorea mi salida para subrayar las líneas de error/advertencia:
tail-color() {
tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
-p
: envuelve el script dentro de un bucle y genera la línea procesada-e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'
colorea cada línea que contiene "WARN"\033[
comienza la secuencia de escape (habilita el formateo)31
significa primer plano rojo43
significa fondo amarillo1
permite caracteres en negritam
cierra la secuencia de escape$1
incluye la línea de entrada\033[0m
es una segunda secuencia para restablecer el formato predeterminado al estándar, después de que se haya generado la línea\007
pitidos
-e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'
colorea cada línea que contiene "ERROR"; las únicas diferencias se refieren a los colores:31
significa primer plano amarillo43
significa fondo rojo
En mi caso, activé la campana visual, por lo que mi pantalla parpadea en caso de error (y mi altavoz no emite ningún pitido) y las líneas de error/advertencia se pueden detectar muy rápidamente.
Puede obtener más información sobre:
perl -p
dominio- Formato de textoen concha
Nuevamente, como explica F. Hauri en su respuesta, puedes hacer muchas cosas gracias a Perl, por lo que podrías "desarrollar" tu propio lector de registros según tus necesidades.