특정 단위에 대해서만 Journalctl 항목을 지우는 방법은 무엇입니까?

특정 단위에 대해서만 Journalctl 항목을 지우는 방법은 무엇입니까?

나는 Python 스크립트를 작성하고 이를 위한 시스템 단위 파일을 만드는 데 며칠을 보냈습니다. 테스트하는 동안 스크립트는 로그에 많은 오류를 기록했습니다. 이제 이 작업을 완료했으므로 로그에서 이러한 오류를 지우고 싶습니다.

아래 설명과 같이 전체 로그를 지우는 방법에는 여러 가지가 있습니다.Journalctl을 지우는 방법 using을 포함하여 journalctl --vacuum-time=2dusing journalctl --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 라이브 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을 사용하여 자신의 스크립트를 사용하여 로그에서 로그 항목을 제거해 볼 수 있습니다.

관련 정보