Filtern Sie jede Systemprotokolldatei nach Datum oder Datumsbereich

12

Was ich erreichen möchte:

Ich möchte eine Systemprotokolldatei nach Datum filtern, dh wenn ich Folgendes tue:

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

es druckt Zeilen wie diese für die drei letzten Tage, sagen wir:

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

Wie grep (auswählen oder filtern):

  • Nach Datum?
  • nach Datum + Stunde?

Was ich versucht habe:

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

Es funktioniert wie erwartet für die syslogDatei, aber nicht für die kern.logDatei, die nur Folgendes zurückgibt : Binary file (standard input) matches. Und wenn ich taildiese bestimmte Datei habe, sehe ich das gleiche Startdatum Format wie in der syslogDatei.

Frage:

Wie kann man dasselbe bei anderen Protokollen wie der kern.logDatei erreichen?

Darüber hinaus ist es möglich zu filtern:

  • nach Datumsbereich?
  • nach Datum + Stundenbereich?

Hinweis: wenn möglich mit "leicht zu merkenden Befehlen".

sk
quelle

Antworten:

14

Mit systemd haben wir journalctl erhalten, das leicht eine feinkörnige Filterung wie diese ermöglicht:

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

Beispiele können kombiniert werden!

Tomodachi
quelle
4
Ok jetzt ist das so cool!
George Udosen
2
Oft ist nicht einmal sudoerforderlich (insbesondere wenn der Benutzer Mitglied der admGruppe ist, die normalerweise der "Hauptbenutzer" ist).
PerlDuck
4

Im Allgemeinen ist das kern.logeine Textdatei. Manchmal kommt es jedoch vor, dass einige Binärdaten enthalten sind, insbesondere wenn das System zuvor abgestürzt ist und das System die Datei nicht ordnungsgemäß schließen konnte. Sie können dann Zeilen bemerken, die Text wie ^@^@^@^@^@^@^@^@^@und so enthalten.

Wenn festgestellt grepwird , dass die Eingabe binär ist , stoppt sie normalerweise die weitere Verarbeitung und druckt ... binary file ...stattdessen. Aber es gibt einen Schalter, um dieses Verhalten zu ändern. Aus der Manpage :

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

Sie können Folgendes versuchen:

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

(Aber ich würde eigentlich die journalctlLösung bevorzugen, die in einer anderen Antwort angegeben ist.)

PerlDuck
quelle