Фільтруйте будь-який файл системного журналу за датою чи діапазоном дат


12

Чого я хочу досягти:

Я хотів би відфільтрувати файл системного журналу за датою, тобто коли я це роблю:

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

він друкує такі лінії за три останні дні, скажімо:

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

Як зібрати (вибрати або відфільтрувати):

  • за датою?
  • за датою + година?

Що я спробував:

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

Він працює , як очікується , на syslogфайл, але не на kern.logфайл, наприклад, який повертає тільки: Binary file (standard input) matches. І коли я саме tailцей файл, я бачу той самий формат дати початку, як у syslogфайлі.

Питання:

Як досягти того ж у інших журналах, як kern.logфайл?

Крім того, чи можна фільтрувати:

  • за діапазоном дат?
  • за датою + годинний діапазон?

Підказка: якщо можливо, за допомогою "легко запам'ятовуються команд".

Відповіді:


14

З системою ми отримали journalctl, який легко дозволяє дрібнозернисту фільтрацію таким чином:

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

Приклади можна комбінувати!


5
Гаразд, це так круто!
Джордж Удосен

2
Часто навіть sudoне потрібно (зокрема, якщо користувач є членом admгрупи, якою зазвичай є "головний" користувач).
PerlDuck

4

Загалом, kern.logце текстовий файл. Але іноді трапляється, що вона містить деякі двійкові дані, особливо коли система раніше вийшла з ладу і система не змогла належним чином закрити файл. Потім ви можете помітити рядки, що містять текст типу тощо ^@^@^@^@^@^@^@^@^@.

Якщо grepпомічає, що його вхід є двійковим , він зазвичай зупиняє подальшу обробку і ... binary file ...замість цього друкує . Але є перехід, щоб змінити таку поведінку. З сторінки керівництва :

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

Ви можете спробувати наступне:

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

(Я б фактично вважав за краще journalctlрішення, подане в іншій відповіді.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.