시스템 로그에 apt/dpkg 활동 기록

시스템 로그에 apt/dpkg 활동 기록

내 목표는 녹음이다.적절한/dpkg활동 용도시스템 로그(rsyslog)로그 항목을 중앙 syslog 서버로 보냅니다.

dpkg는 /var/log/dpkg.log, apt는 /var/log/apt디렉토리에 씁니다.

제가 조사해본 결과 apt와 dpkg 모두 syslog를 사용할 수 있는 것 같습니다. 유일한 옵션은 rsyslog "텍스트 파일 입력 모듈" 기능(http://www.rsyslog.com/doc/master/configuration/modules/imfile.html), 정기적으로 로그 파일에 새 콘텐츠가 있는지 확인합니다.

/etc/dpkg/dpkg.cfg구성 파일에는 log옵션이 있지만 dpkg.cfg 옵션 및 기능에 대한 매뉴얼 페이지는 없습니다.

그건 진실이야rsyslog 파일유일한 선택은?

답변1

dpkg의 경우 다음을 추가하여 수행할 수 있습니다.

status-logger "logger -t dpkg -p info"

도착하다/etc/dpkg/dpkg.cfg. apt-get이 dpkg를 호출하므로 apt-get/apt 작업도 기록됩니다. man logger시스템 로그에 기록된 정보 조정을 참조하십시오 .

구성을 업데이트하기 위해 이 작업을 사용하고 있습니다.

- name: dpkg syslog
  lineinfile:
   dest: /etc/dpkg/dpkg.cfg
   line: 'status-logger "logger -t dpkg -p info"'

systemd 로그를 사용하는 경우 다음을 통해 쉽게 로그를 확인할 수 있습니다.

journalctl SYSLOG_IDENTIFIER=dpkg

답변2

--log이 옵션을 사용하면 dpkg가 출력을 기록하는 위치를 수정할 수 있습니다 . 이는 파일 이름만 허용합니다. DPKG는 패키지 조작을 위한 간단하면서도 효율적인 도구로 제작되었으므로 일을 복잡하게 만드는 로거가 없다는 것은 장점입니다. 가장 간단한 방법은 이미 알고 있듯이 파일에 쓴 다음 syslog가 해당 파일에서 읽는 것입니다.

status-fd파일 설명자에 상태를 보내 /dev/log거나 status-logger중간자(man-in-the-middle)가 항목을 syslog에 보내도록 하는 데 사용할 수 있습니다 .

답변3

지시어에 지정된 로그 파일과 항상 동일한 출력을 갖는 것은 아닌 status-logger것 같습니다 . dpkg의 소스 코드에는 다시 컴파일하지 않으면 변경할 수 없는 하드 코딩도 있습니다 .status-fdlogalternatives.log

그래서 로그 파일을 fifo로 교체하고 로그 내용을 저널드에 펌핑해 보았습니다. systemd의 유연성으로 인해 추가 종속성 없이 이 작업을 수행할 수 있습니다.

  1. 에서 bash 스크립트를 준비하십시오 /usr/local/libexec/fifo2journal. 잊지 마요 chmod +x. 스크립트에는 cat60초의 효과적인 하드 코딩된 제한 시간이 있습니다. 표준 입력에 사용할 수 있는 데이터가 없는 경우(또는 개행 문자가 없는 경우) 이 스크립트는 읽은 줄의 일부만 출력하고 종료합니다(자원을 절약하기 위해).

    #!/bin/bash
    while :; do
        if IFS= read -r -t 60; then
            printf "%s\n" "$REPLY"
        else
            printf "%s" "$REPLY"
            exit 0
        fi
    done
    
  2. 시스템 장치를 준비합니다. (파일 시스템에서 fifo를 사용하여 소켓을 활성화합니다)

    ㅏ./etc/systemd/system/[email protected]

    [Unit]
    Description=fifo at %f
    
    [Socket]
    ListenFIFO=%f
    SocketMode=0660
    
    [Install]
    WantedBy=sockets.target
    

    비./etc/systemd/system/[email protected]

    [Unit]
    Description=fifo to journal for %f
    Requires=fifo2journal@%i.socket
    
    [Service]
    ExecStart=/usr/local/libexec/fifo2journal
    StandardInput=socket
    StandardOutput=journal
    SyslogIdentifier=%f
    SyslogFacility=user
    
  3. 디스크에 있는 기존 로그 파일을 삭제합니다(원하는 경우 백업을 만드세요). 시스템 소켓 장치를 활성화하고 시작합니다.

    systemctl daemon-reload
    for FILEPATH in /var/log/dpkg.log /var/log/alternatives.log; do
        rm -f "$FILEPATH"
        UNIT_NAME=$(systemd-escape [email protected] --path "$FILEPATH")
        systemctl enable "$UNIT_NAME"
        systemctl start "$UNIT_NAME"
    done
    

이제 로그( journalctl -f -t /var/log/dpkg.log)를 보고 로그에 쓰기( echo hello >/var/log/dpkg.log)를 시도할 수 있습니다.

logrotate는 fifo를 빈 로그로 취급하고 아무 작업도 수행하지 않습니다.

이 방법을 사용하려면 소켓을 활성화하려면 systemd가 실행 중이어야 합니다. systemd가 실행 중이 아니고 fifo를 사용하지 않고 (닫힌) fifo를 열려고 하면 O_NONBLOCK의도하지 않은 결과가 발생할 수 있습니다. 특히 chroot를 통해 rootfs를 구출하는 경우 더욱 그렇습니다.

O_NONBLOCKsystemd를 업그레이드하는 중이고 어떤 이유로든 소켓 활성화가 60초 창 내에 준비되지 않고 fifo를 열려고 하는 모든 스레드가 중단되는 경우 잠재적인 문제가 있습니다. 이런 일이 절대 일어나지 않기를 바랍니다.

관련 정보