내 목표는 녹음이다.적절한/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-fd
log
alternatives.log
그래서 로그 파일을 fifo로 교체하고 로그 내용을 저널드에 펌핑해 보았습니다. systemd의 유연성으로 인해 추가 종속성 없이 이 작업을 수행할 수 있습니다.
에서 bash 스크립트를 준비하십시오
/usr/local/libexec/fifo2journal
. 잊지 마요chmod +x
. 스크립트에는cat
60초의 효과적인 하드 코딩된 제한 시간이 있습니다. 표준 입력에 사용할 수 있는 데이터가 없는 경우(또는 개행 문자가 없는 경우) 이 스크립트는 읽은 줄의 일부만 출력하고 종료합니다(자원을 절약하기 위해).#!/bin/bash while :; do if IFS= read -r -t 60; then printf "%s\n" "$REPLY" else printf "%s" "$REPLY" exit 0 fi done
시스템 장치를 준비합니다. (파일 시스템에서 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
디스크에 있는 기존 로그 파일을 삭제합니다(원하는 경우 백업을 만드세요). 시스템 소켓 장치를 활성화하고 시작합니다.
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_NONBLOCK
systemd를 업그레이드하는 중이고 어떤 이유로든 소켓 활성화가 60초 창 내에 준비되지 않고 fifo를 열려고 하는 모든 스레드가 중단되는 경우 잠재적인 문제가 있습니다. 이런 일이 절대 일어나지 않기를 바랍니다.