Filtrer tout fichier journal système par date ou plage de dates

12

Ce que je veux réaliser:

Je voudrais filtrer un fichier journal système par date, c'est-à-dire quand je le fais:

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

il imprime des lignes comme celles-ci pour les trois derniers jours disons:

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

Comment grep (sélectionner ou filtrer):

  • par date?
  • par date + heure?

Ce que j'ai essayé:

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

Il fonctionne comme prévu sur le syslogdossier, mais pas sur le kern.logfichier par exemple, qui ne les rendements: Binary file (standard input) matches. Et quand je tailce fichier particulier, je peux voir le même format de date de début que dans le syslogfichier.

Question:

Comment obtenir la même chose sur d'autres journaux comme le kern.logfichier?

De plus, est-il possible de filtrer:

  • par plage de dates?
  • par date + plage horaire?

Astuce: si possible, avec des "commandes faciles à retenir".

sk
la source

Réponses:

14

Avec systemd, nous avons obtenu journalctl qui permet facilement un filtrage à grain fin comme celui-ci:

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

Les exemples peuvent être combinés!

tomodachi
la source
5
Ok maintenant c'est trop cool!
George Udosen
2
Souvent, il n'est même pas sudonécessaire (en particulier si l'utilisateur est membre du admgroupe, qui est généralement l'utilisateur "principal").
PerlDuck
4

En général, kern.logc'est un fichier texte. Mais il arrive parfois qu'il contienne des données binaires , en particulier lorsque le système est tombé en panne auparavant et que le système n'a pas pu fermer correctement le fichier. Vous pouvez alors remarquer des lignes contenant du texte comme ^@^@^@^@^@^@^@^@^@et tel.

Si vous grepremarquez que son entrée est binaire , il arrête généralement le traitement et imprime à la ... binary file ...place. Mais il y a un interrupteur pour changer ce comportement. Depuis la page de manuel :

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

Vous pouvez essayer ce qui suit:

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

(Mais je préférerais en fait la journalctlsolution donnée dans une autre réponse.)

PerlDuck
la source