Filtruj dowolny plik dziennika systemu według daty lub zakresu dat


12

Co chcę osiągnąć:

Chciałbym filtrować systemowy plik dziennika według daty, tj. Kiedy:

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

wypisuje takie linie z ostatnich trzech dni, powiedzmy:

(...)
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

Jak grep (wybierz lub przefiltruj):

  • według daty?
  • według daty + godziny?

Co próbowałem:

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

To działa zgodnie z oczekiwaniami na syslogpliku, ale nie w kern.logpliku na przykład, który zwraca tylko: Binary file (standard input) matches. A kiedy mam tailten konkretny plik, widzę ten sam format daty początkowej, co w syslogpliku.

Pytanie:

Jak osiągnąć to samo w innych dziennikach, takich jak kern.logplik?

Ponadto, czy można filtrować:

  • według zakresu dat?
  • według daty + zakresu godzin?

Wskazówka: jeśli to możliwe, za pomocą „łatwych do zapamiętania poleceń”.

Odpowiedzi:


14

Z systemd otrzymaliśmy Journalctl, który z łatwością pozwala na drobnoziarniste filtrowanie:

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

Przykłady można łączyć!


5
Ok, teraz jest super!
George Udosen

2
Często nawet nie sudojest to wymagane (w szczególności jeśli użytkownik jest członkiem admgrupy, którym zwykle jest „główny” użytkownik).
PerlDuck

4

Ogólnie kern.logjest to plik tekstowy. Ale czasami zdarza się, że zawiera on pewne dane binarne , szczególnie gdy system się zawiesił i system nie mógł poprawnie zamknąć pliku. Następnie możesz zauważyć wiersze zawierające tekst podobny ^@^@^@^@^@^@^@^@^@i taki.

Jeśli grepzauważy, że jego dane wejściowe są binarne , zwykle zatrzymuje dalsze przetwarzanie i ... binary file ...zamiast tego drukuje . Ale jest przełącznik, aby zmienić to zachowanie. Z strony podręcznika :

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

Możesz spróbować:

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

(Ale wolałbym journalctlrozwiązanie podane w innej odpowiedzi).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.