特定のユニットに対してのみJournalctlエントリを消去する方法は?

特定のユニットに対してのみJournalctlエントリを消去する方法は?

私はPythonスクリプトを作成し、そのためのシステム単位ファイルを作成するのに数日を費やしました。テスト中、スクリプトはログに多くのエラーを記録しました。これでこれが完了したので、ログからこれらのエラーを消去したいと思います。

以下のようにログ全体を消去する方法はいくつかあります。Journalctlをクリアする方法 using を含むjournalctl --vacuum-time=2dusingjournalctl --vacuum-size=500Mと temporary はSystemMaxUse=/etc/systemd/journald.conf で非常に低い値に設定されます。

これらはすべてログを消去し、すべてのデバイスに影響を与えるようです。単一セルの項目だけを消去するだけです。可能ですか?

答え1

私のPython 3プログラムを使うcopylog.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

答え2

システムログから特定のメッセージを削除する方法を探しています。これはまれではないようです(誤って誤ったコマンドを実行したり、スパムが多い場合など)。

既存のファイルを変更して特定の項目を編集することは不可能なようです。システムログ形式主に、オプションの圧縮、ハッシュ、更新カウンタ、オフセット、およびハッシュへのインデックス参照を含む追加をサポートするように設計されています。最初はこれを試しましたが、誰にもお勧めできません。

特定のエントリを削除するために私が見つけた最善の方法は、既存のログファイルに基づいて新しいログファイルを作成することです(たとえば、次のPythonスクリプト)。もう一つの答えこれを行う)。Systemdは実際にログエントリを簡単に修正するために必要なツールを提供します。この原則を活用してください。

簡潔なバージョン

デフォルトでは、ログをテキスト形式にエクスポートしてからログに戻します。

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

初期出力をプログラム/スクリプト(例:awk、sedなど)にパイプした後systemd-journal-remote

よりパッシブなアプローチは、テキストをファイルに書き込み、テキストエディタを使用してファイルを手動で変更してからファイルに戻すことです.journal。これについては以下で詳細に説明する。

長いバージョン

これは、既存のログを修正するための段階的なガイドであるより長いバージョンです(Ubuntu Live USB、systemd 246を使用してArchLinuxでテストされています)。

  1. まず、ロギングがオフになっていることを確認してください。たとえば、コンピュータをシャットダウンします。

  2. 別のデバイスを起動します(たとえば、起動可能なライブ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.Output
    の例を使用)。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
    

答え3

ここに答えをコピーしました。stackoverflowに関する重複質問

可能な特定のバージョンが見つかりません。 Journaltclのドキュメントには--vacuum-time(または-sizeまたは-files)を--unitと組み合わせることができるという言及さえありませんが、ver:249があり、掃除が行われました。バージョン:218では、ユニットフィルタがバージョン:195に登場しました。

TLDR:もはや古い、バイパスの方法は必要ありません。
ユニットのすべてのログをクリーンアップするには:
journalctl --vacuum-time=1s --unit=your.service

他のすべてのログを交換してもかまいません。デバイスでログを探している場合(最後のログがまだ交換されていないことを意味)、一度にすべて交換できます。
journalctl --rotate --vacuum-time=1s --unit=your.service

答え4

Journalctl のマニュアルページによると、「回転しているか、現在記録されているかにかかわらず、アクセス可能なすべてのログファイルから出力がインターリーブされます」だからこれは可能ではないと思います。

ただし、「journalctl -u some.service」でフィルタリングしてから、cronを使用して独自のスクリプトを使用してログからログエントリを削除することができます。

関連情報