Evitar que a cauda modifique o conjunto de caracteres do terminal

5

Em um terminal Linux (CentOS) estou usando o comando tail --follow=name my-rolling-file.log para ver os logs do meu aplicativo.

Às vezes, no log, há alguns dados binários despejados (eu despejo o corpo de uma mensagem Camel que geralmente contém strings, mas às vezes caracteres binários e / ou especiais como o chinês em UTF-8) e quando isso acontece meu terminal fica corrompido como os caracteres do canal | agora são ö .

Eu adivinhei que é o registro de dados binários que pode causar o problema e estou querendo saber se é possível pedir ao comando tail para ignorar caracteres especiais. Eu verifiquei a página do manual, mas não encontrei nada lá.

Atualmente, para corrigir o problema, tenho que Ctrl-C do tailing, fazer um reset no terminal e relançar o comando tail . Eu quero evitar essas operações, se possível.

Se você conhece outro comando que não o tail , mas com os mesmos recursos (seguindo os arquivos contínuos), ele seria aceitável, bem como o tempo que é instalável e executável no CentOS 6.5.

    
por рüффп 14.04.2015 / 12:13

4 respostas

5

E sobre isso,

tail --follow=name my-rolling-file.log | strings

O padrão para strings é que ele só emitirá caracteres imprimíveis em comprimentos de 4 (ou mais), mas você pode alterar isso com -n {number} .

    
por 14.04.2015 / 12:36
9

Você pode traduzir caracteres especiais (dados binários) em caracteres comuns que são seguros para exibir canalizando seu comando tail para cat -v :

tail --follow=name my-rolling-file.log | cat -v

A opção -v (detalhada) de cat (também conhecida como --show-nonprinting ) exibe caracteres "não imprimíveis" usando as notações ^ e M- :

  • 0x00 é exibido como ^@
  • 0x01 é exibido como ^A
  • 0x02 é exibido como ^B
  • etc.
  • 0x7F é exibido como ^?
  • 0x80-0xFF são exibidos como M- seguido pela representação da ordem baixa sete bits do byte.

Ou, se você preferir descartar os caracteres, use:

tail --follow=name my-rolling-file.log | tr -cd "\t\n -~"

tr "traduz" caracteres; ou seja, mapeia-os. Pode ser usado, por exemplo, para alterar letras minúsculas para maiúsculas. A opção -d diz para excluir caracteres; por exemplo, tr -d aeiou exclui todas as vogais (minúsculas). A opção -c significa complemento; isto é, faça todos os caracteres que não sejam os que eu especificar. "\t\n -~" é tabulação, nova linha e todos os caracteres imprimíveis comuns.

    
por 14.04.2015 / 12:48
3

Converta caracteres (alguns incômodos) em . com tr :

tail -f data | tr "
tail -f data | tr "%pre%0-13-77-7" "."
0-13-77-7" "."
    
por 14.04.2015 / 12:39
2

Deixe o less lidar com o problema, pois é bom nisso.

O pager less é muito bom na formatação de arquivos binários para saída. Além disso, os recursos de pager, como rolagem e pesquisa, são geralmente úteis. Ele não tem nenhuma opção direta para seguir um arquivo que cresce, mas tem como fornecer as teclas digitadas para "digitar" após a inicialização.

A chave F começa a seguir o arquivo crescente, atualizando a tela quando o arquivo cresce.
Prefixe a chave com + em vez de - e use isso como uma opção:

Substituindo tail -f :

less +F growing-file.log

Para continuar seguindo o arquivo pelo nome, mesmo que seja removido ou excluído e recriado com o mesmo nome, adicione a opção --follow-name ; Modifica o que a chave F e +F faz, não começa a seguir por si só:

Substituindo tail -F ( --follow=name ):

less --follow-name +F rolling-file.log

Se o arquivo for reconhecido como "arquivo binário", less perguntará se você realmente quer vê-lo - para evitar a pergunta, use a opção -f ( --force ) também:

less --follow-name +F -f rolling-binary-file.log

(Observe que o significado de -f para less é diferente da mesma opção para tail .)

Use Ctrl + c para parar de seguir, o que lhe permite rolar para trás ou pesquisar.

  • Comece a seguir novamente com F .
  • Ir para começar: g .
  • Ir para começar: G .
  • Pesquisa: / .
  • Sair: q .

Exemplo de saída binária

$ less +F /usr/bin/vim 
"/usr/bin/vim" may be a binary file.  See it anyway?

Depois de pressionar y (o que você pode evitar com -f ), a tela mostra:

 ^A^@^@^@^@^@<E5>
 ^A^@^@^@^@^@<E6>
 ^A^@^@^@^@^@^@^P^A^@^@^@^@^@^B^P^A^@^@^@^@^@8^P^A^@^@^@^@^@F^P^A^@^@^@^@^@
 <F1>^A^@^@^@^@^@^P<F1>^A^@^@^@^@^@-<F1>^A^@^@^@^@^@0<F1>^A^@^@^@^@^@i<F1>^A
 ^L(^@^@^@^@^@^@^@^@^@^@^@^@^@<A3><A5>&^@^@^@^@^@^@^@^@^@^@^@^@^@b['^@^@^@^@
 @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@@<A7>&^@^@^@^@
 <AB>&^@^@^@^@^@Ȣ&^@^@^@^@^@^L,^@^@^@^@^@^@<FF><FF><FF><FF><FF><FF><FF><FF>
  ^@^@^@^@^@^@s]&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^_<D3>%^@^@^@^@^@̢
 <AF>&^@^@^@^@^@<CA><(^@^@^@^@^@^B^D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 <B1>&^@^@^@^@^@^D^D^H^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^R<B1>&^@^@
 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<A9><B3>&^@^@^@^@^@D<B8>&^@^@
 <B5>&^@^@^@^@^@^]T&^@^@^@^@^@^BL^@^@^@^@^@^@H<8A>O^@^@^@^@^@F@^@^@^@^@^@^@
 K'^@^@^@^@^@^C<C4><FF><FF>^@^@^@^@^OK'^@^@^@^@^@^C<C3><FF><FF>^@^@^@^@^TK'
 #^@^@^@^@^@^D^@^@^@^@^@^@^@<E7>v&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 #^@^@^@^@^@^D^@^@^@^@^@^@^@<E7>v&^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 #^@^@^@^@^@p|#^@^@^@^@^@P~#^@^@^@^@^@^@^@^@^@^@^@^@^@^P
 #^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<90>{#^@^@^@^@^@^@^@^@^@^@^@^@^@
Waiting for data... (interrupt to abort)

Os caracteres de controle são mostrados na notação de carretel como ^A ( ^@ é o byte nulo).
Eles também são destacados no terminal (que não é mostrado acima), para tornar o caractere Control-A, ^A diferente do caractere ^ seguido por A .

Configuração de como mostrar caracteres binários

De man less :

Control  and  binary  characters  are  displayed  in  standout (reverse
video).  Each such character is displayed in caret notation if possible
(e.g.  ^A for control-A).  Caret notation is used only if inverting the
0100 bit results in a normal printable character.  Otherwise, the char‐
acter  is displayed as a hex number in angle brackets.  This format can
be changed by setting the LESSBINFMT environment variable.   LESSBINFMT
may begin with a "*" and one character to select the display attribute:
"*k" is blinking, "*d" is bold, "*u" is underlined, "*s"  is  standout,
and  "*n"  is  normal.  If LESSBINFMT does not begin with a "*", normal
attribute is assumed.  The remainder of LESSBINFMT is  a  string  which
may  include one printf-style escape sequence (a % followed by x, X, o,
d, etc.).  For example, if LESSBINFMT is  "*u[%x]",  binary  characters
are  displayed  in  underlined hexadecimal surrounded by brackets.  The
default if no LESSBINFMT is  specified  is  "*s<%02X>".   Warning:  the
result  of  expanding the character via LESSBINFMT must be less than 31
characters.

When the character set is utf-8, the LESSUTFBINFMT environment variable
acts similarly to LESSBINFMT but it applies to Unicode code points that
were successfully decoded but are unsuitable for display  (e.g.,  unas‐
signed  code  points).   Its  default  value is "<U+%04lX>".  Note that
LESSUTFBINFMT and LESSBINFMT  share  their  display  attribute  setting
("*x")  so specifying one will affect both; LESSUTFBINFMT is read after
LESSBINFMT so its setting, if any,  will  have  priority.   Problematic
octets  in  a  UTF-8  file (octets of a truncated sequence, octets of a
complete but non-shortest form  sequence,  illegal  octets,  and  stray
trailing  octets)  are displayed individually using LESSBINFMT so as to
facilitate diagnostic of how the UTF-8 file is ill-formed.
    
por 14.04.2015 / 14:13