私はPythonスクリプトを作成し、そのためのシステム単位ファイルを作成するのに数日を費やしました。テスト中、スクリプトはログに多くのエラーを記録しました。これでこれが完了したので、ログからこれらのエラーを消去したいと思います。
以下のようにログ全体を消去する方法はいくつかあります。Journalctlをクリアする方法
using を含むjournalctl --vacuum-time=2d
usingjournalctl --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でテストされています)。
まず、ロギングがオフになっていることを確認してください。たとえば、コンピュータをシャットダウンします。
別のデバイスを起動します(たとえば、起動可能なライブUSB経由)。これは、不注意にジャーナルに影響を与えずに変更できるようにするためです。
意図しない副作用を最小限に抑えるために、元のディスクを読み取り専用としてマウントしてください。たとえば、
$ sudo mount -o ro /dev/sda1 /mnt
LUKS暗号化デバイスを使用する場合の別の例:
$ sudo cryptsetup luksOpen /dev/sda1 whateverName $ sudo mount -o ro /dev/mapper/whateverName /mnt
現在のデバイスに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
準備ができたらログをエクスポートします。
$ journalctl --file=system.journal -o export > /tmp/export.txt
エクスポートを編集して、アイテムを編集、追加、変更、または削除します。必要に応じて、chrootの外部でこれを行うことができます(例:
vi -b /tmp/export.txt
.Output
の例を使用)。https://www.freedesktop.org/wiki/Software/systemd/export/必要な修正を行った後、を使用してジャーナルに変換します
systemd-journal-remote
。バイナリはbin /にないため、$PATH
プログラムの場所への絶対パスを使用する必要があります。$ /lib/systemd/systemd-journal-remote --output=/tmp/result.journal /tmp/export.txt
たとえば、次のコマンドを使用してログにページを付けて、ログに必要な出力があるかどうかを確認します。
$ journalctl --file=/tmp/result.journal
満足している場合は、次のステップに進んでください。それ以外の場合は、手順6から繰り返してください。
必要に応じてchroot(CtrlDまたは単に
exit
)を終了し、手順4を元に戻します。$ sudo umount /mnt/proc $ sudo umount /mnt/tmp $ sudo umount /mnt/var/tmp
これで元のログを上書きしようとします。
ボリュームを読み取り専用でマウントした場合(ステップ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/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を使用して独自のスクリプトを使用してログからログエントリを削除することができます。