Memfilter file log sistem apa pun berdasarkan tanggal atau rentang tanggal

12

Apa yang ingin saya capai:

Saya ingin memfilter file log sistem berdasarkan tanggal, yaitu ketika saya melakukannya:

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

itu mencetak garis seperti ini selama tiga hari terakhir katakanlah:

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

Cara grep (pilih, atau filter):

  • tanggal?
  • menurut tanggal + jam?

Apa yang saya coba:

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

Ia bekerja seperti yang diharapkan pada syslogfile, namun tidak pada kern.logberkas misalnya, yang hanya pengembalian: Binary file (standard input) matches. Dan ketika saya tailfile khusus ini saya bisa melihat format tanggal mulai yang sama daripada di syslogfile.

Pertanyaan:

Bagaimana cara mencapai hal yang sama pada log lain seperti kern.logfile?

Selain itu, apakah mungkin untuk menyaring:

  • menurut rentang tanggal?
  • menurut tanggal + rentang jam?

Petunjuk: jika memungkinkan, dengan "perintah yang mudah diingat".

sk
sumber

Jawaban:

14

Dengan systemd kami mendapat journalctl yang dengan mudah memungkinkan pemfilteran berbutir halus seperti ini:

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

Contohnya bisa digabungkan!

tomodachi
sumber
5
Ok sekarang ini sangat keren!
George Udosen
2
Seringkali bahkan tidak sudodiperlukan (khususnya jika pengguna adalah anggota admgrup, yang biasanya pengguna "utama").
PerlDuck
4

Secara umum, kern.logini adalah file teks. Tetapi kadang-kadang terjadi bahwa itu berisi beberapa data biner , terutama ketika sistem telah crash sebelumnya dan sistem tidak dapat menutup file dengan benar. Anda kemudian dapat melihat baris yang berisi teks suka ^@^@^@^@^@^@^@^@^@dan semacamnya.

Jika greppemberitahuan inputnya biner , biasanya berhenti memproses dan mencetak lebih lanjut ... binary file .... Tetapi ada perubahan untuk mengubah perilaku ini. Dari halaman 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.
[...]

Anda dapat mencoba yang berikut ini:

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

(Tapi saya sebenarnya lebih suka journalctlsolusi yang diberikan dalam jawaban lain.)

PerlDuck
sumber