Как очистить записи journalctl только для определенного модуля?

Прошивки машин не сохраняются отслеживать, в каком часовом поясе они находятся, поэтому если вы хотите, чтобы они отслеживали абсолютное текущее время, вы должны выбрать какой-то стандарт, и на самом деле нет другого очевидного выбора для этого, кроме UTC. Если разные люди выберут разные стандарты, то либо микропрограмма машины должна будет предоставлять интерфейс, чтобы сообщить ОС, какая из них используется, либо обеспечить интерфейс для времени в «стандартном» часовом поясе - и мы вернемся к UTC.

Что еще хуже, многие часовые пояса в мире не имеют фиксированного смещения от UTC: у них есть два разных фиксированных смещения от UTC в зависимости от того, какое время года это. Прошивка машины должна знать эти правила и применять их. Для любого часового пояса, который вы могли бы захотеть использовать! И эти правила время от времени меняются! Если микропрограмма машины не отслеживает и не применяет эти правила, но вы все же хотите сохранить время микропрограммы в локальном часовом поясе (с переменным смещением), ОС должна компенсировать это путем применения взлома, но тогда невозможно надежно определить, или нет хак в настоящее время применяется. Это просто несостоятельно.

Итак ... UTC FTW. Прошивка машины низкого уровня. Есть ли у него какая-то причина знать местное время в том месте, где он работает?

19
23.09.2017, 23:03
2 ответа

Используйте мою программу Python 3 copy_journal.py для файлов журнала в /var/log/journal, из которых вы хотите удалить записи.

Например, чтобы сделать копию system.journal без записей журнала для NetworkManager.service:

$ journalctl --file=system.journal | wc
    167    1934   18825
$ journalctl --file=system.journal | grep -v NetworkManager | wc
     77     881    8421
$ python3 copy_journal.py --remove-unit=NetworkManager.service system.journal system-without-nm.journal
$ journalctl --file=system-without-nm.journal | wc
     77     881    8421
12
27.01.2020, 19:45

Я искал способ удалить конкретное сообщение из журнала systemd. Это не казалось необычным сценарием (, например. случайное выполнение неправильной команды или наличие большого количества спама ).

Представляется невозможным отредактировать определенные записи, изменив существующий файл, потому что формат журнала systemd в первую очередь предназначен для поддержки добавления, которое включает в себя необязательное сжатие, хеширование, обновление счетчиков, индексирование ссылок на смещения. и хеши. Я попробовал это сначала, но никому не рекомендовал бы делать это.

Я обнаружил, что для удаления определенных записей лучше всего создать новый файл журнала на основе существующего файла журнала (, например. скрипт Python из другой ответ делает это ). Systemd фактически поставляет необходимые инструменты для простого изменения записей журнала , используя этот принцип.

Краткая версия

По сути, экспортировать журнал в текстовый формат, а затем преобразовать его обратно в журнал:

  • journalctl --file=system.journal -o export | /lib/systemd/systemd-journal-remote --output=result.journal

Этот механизм можно легко расширить, направив первоначальный вывод в программу/скрипт (, например awk, sed и т. д. )для выполнения автоматической фильтрации перед его передачей в systemd-journal-remote.

Более ручной подход заключается в записи текста в файл, изменении файла вручную с помощью текстового редактора и последующем преобразовании его обратно в .journalфайл. Это объясняется более подробно ниже.

Длинная версия

Вот более длинная версия,пошаговое -за -пошаговое руководство по изменению существующего журнала (, протестированного в ArchLinux, с использованием Ubuntu live USB, systemd 246 ).

  1. Во-первых, убедитесь, что журнал закрыт. Например, выключив компьютер.

  2. Загрузите другое устройство (через загрузочный live USB, например ). Это делается для того, чтобы можно было вносить изменения, не оказывая непреднамеренного влияния на журнал.

  3. Чтобы свести к минимуму случайные побочные эффекты, монтируйте исходный диск только для чтения -. Например:

    $ sudo mount -o ro /dev/sda1 /mnt
    

    другой пример, если вы используете LUKS для шифрования устройства:

    $ sudo cryptsetup luksOpen /dev/sda1 whateverName
    $ sudo mount -o ro /dev/mapper/whateverName /mnt
    
  4. Если на вашем текущем устройстве нет systemd / journalctl, используйте chroot, чтобы иметь возможность использовать двоичные файлы с вашего -диска только для чтения. Минимум, чтобы заставить это работать, выглядит следующим образом:

    $ sudo mount --bind /tmp /mnt/tmp
    $ sudo mount --bind /tmp /mnt/var/tmp
    $ sudo mount -t proc /proc /mnt/proc
    $ sudo chroot /mnt
    


  1. Когда будете готовы, экспортируйте журнал.

    $ journalctl --file=system.journal -o export > /tmp/export.txt
    
  2. Отредактируйте экспорт, чтобы отредактировать, добавить, изменить или удалить записи. Вы можете сделать это вне chroot, если хотите, например. с vi -b /tmp/export.txt.
    Пример вывода:https://www.freedesktop.org/wiki/Software/systemd/export/

  3. После внесения необходимых изменений преобразуйте его обратно в журнал с помощью systemd-journal-remote. Этого бинарника нет в bin/$PATH, поэтому нужно использовать абсолютный путь к местоположению программы:

    $ /lib/systemd/systemd-journal-remote --output=/tmp/result.journal /tmp/export.txt
    
  4. Убедитесь, что в журнале есть нужный вывод, например. листая журнал с помощью:

    $ journalctl --file=/tmp/result.journal
    

    Если вы удовлетворены, переходите к следующему шагу. В противном случае повторите с шага 6.



  1. Выйдите из chroot(CtrlD или простоexit)и при необходимости отмените шаг 4:

    $ sudo umount /mnt/proc
    $ sudo umount /mnt/tmp
    $ sudo umount /mnt/var/tmp
    
  2. Теперь мы собираемся перезаписать исходный журнал.
    Если вы смонтировали том как для чтения -, только (, шаг 3 ), перемонтируйте как доступный для записи.

    $ sudo mount -o remount,rw /mnt
    

    Чтобы избежать нежелательных изменений атрибутов файла или владельца, просто замените содержимое, а не копируйте файл.

    # cat /tmp/result.journal > /mnt/var/log/journal/MACHINE_ID_HERE/system.journal
    

    или, если вы не работаете в корневой оболочке, используйте sudo tee outfile >/dev/null, например:

    $ </tmp/result.journal sudo tee /mnt/var/log/journal/MACHINE_ID_HERE/system.journal >/dev/null
    
  3. При необходимости размонтируйте диск (из шага 3/шага 10 ).

    $ sudo umount /mnt
    

    Если вы открыли зашифрованный том (на шаге 3 ), снова заблокируйте его:

    $ sudo cryptsetup luksClose whateverName
    
2
27.10.2020, 21:57

Теги

Похожие вопросы