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}
.
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.
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-
:
^@
^A
^B
^?
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.
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" "."
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:
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ó:
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.
$ 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
.
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.