Filtrar qualquer arquivo de log do sistema por data ou intervalo de datas

12

O que eu quero alcançar:

Gostaria de filtrar um arquivo de log do sistema por data, ou seja, quando:

$ cat /var/log/syslog | grep -i "error\|warn\|kernel" 

imprime linhas como estas nos últimos três dias, digamos:

(...)
Apr  3 06:17:38 computer_name kernel: [517239.805470] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
(...)
Apr  4 19:34:21 computer_name kernel: [517242.523165] e1000e: enp0s25 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
(...)
Apr  5 09:00:52 computer_name kernel: [517242.523217] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s25: link becomes ready

Como grep (selecionar ou filtrar):

  • por data?
  • por data + hora?

O que eu tentei:

$ cat /var/log/syslog | grep -i "Apr  5" | grep -i "error\|warn\|kernel" 

Ele funciona como esperado no syslogarquivo, mas não no kern.logarquivo, por exemplo, que só retorna: Binary file (standard input) matches. E quando eu vejo tailesse arquivo em particular, vejo o mesmo formato de data de início do que no syslogarquivo.

Questão:

Como conseguir o mesmo em outros logs como o kern.logarquivo?

Além disso, é possível filtrar:

  • por período?
  • por data + intervalo de horas?

Dica: se possível, com "comandos fáceis de lembrar".

sk
fonte

Respostas:

14

Com o systemd, obtivemos o journalctl, que permite facilmente uma filtragem granular como esta:

sudo journalctl --since "2 days ago"   
sudo journalctl --since "2019-03-10" --until "2019-03-11 03:00"
sudo journalctl -b # last boot 
sudo journalctl -k # kernel messages
sudo journalctl -p er # by priority (emerg|alert|crit|err|warning|info|debug)
sudo journalctl -u sshd # by unit 
sudo journalctl _UID=1000 # by user id

Exemplos podem ser combinados!

tomodachi
fonte
5
Ok, agora isso é tão legal!
George Udosen
2
Freqüentemente, nem sudoé necessário (em particular se o usuário for membro do admgrupo, que normalmente é o usuário "principal").
PerlDuck
4

Em geral, kern.logé um arquivo de texto. Mas às vezes acontece que ele contém alguns dados binários , especialmente quando o sistema travou antes e o sistema não pôde fechar o arquivo corretamente. Você pode notar linhas contendo texto como ^@^@^@^@^@^@^@^@^@esse.

Se grepperceber que sua entrada é binária , geralmente interrompe o processamento e imprime ... binary file .... Mas há uma opção para mudar esse comportamento. Na página de manual :

[...]
File and Directory Selection
   -a, --text
          Process a binary file as if it were text; 
          this is equivalent to the --binary-files=text option.
[...]

Você pode tentar o seguinte:

$ grep -a -i "Apr  5" /var/log/kern.log  | grep -i "error\|warn\|kernel"

(Na verdade, eu preferiria a journalctlsolução dada em outra resposta.)

PerlDuck
fonte