모듈이 스크립트의 출력을 파일에 캡처하기 위해 매개 변수를 사용 하지 않는 omprog
것 같은 문제가 발생했습니다 . 내가 뭘 잘못했나요?rsyslog
output
내 rsyslog
서버는 외부 호스트로부터 초당 12개의 syslog 메시지를 수신하며 메시지가 특정 조건을 충족할 때 특정 작업을 수행하고 싶습니다. 그래서 특정 조건을 스캔 stdin
하고 작업을 수행하는 Python 스크립트를 작성했습니다. (이 작업은 대략 몇 시간마다 트리거됩니다.) 다른 모든 메시지의 경우 Python 스크립트는 메시지를 삭제하고 계속 수신합니다. 파이프가 열리면 Python 스크립트가 무기한 실행됩니다. 모두 완벽해요.
stdout
그런 다음 Python 스크립트가 시작될 때 "시작됨" 메시지를 출력하고 stdout
작업이 발생할 때 "완료" 메시지를 출력하도록 몇 가지 확인 메시지를 Python 스크립트에 추가했습니다. omprog
매개변수를 confirmMessages
로 설정 off
하고 output
매개변수를 /var/log
. 출력에서는 getenforce
SELinux가 다운되었다고 알려줍니다. 재부팅하면 rsyslog
파일이 생성되지 않고 출력이 캡처되지 않습니다.
그래서 touch
syslog 사용자로 파일을 편집하고 재부팅했지만 rsyslog
문제가 해결되지 않았습니다. 실행하면 systemctl status rsyslog
Python 스크립트가 실행 중임을 나타냅니다. 스크립트를 보면 특정 메시지가 실행되고 있음을 확인할 수 있습니다.
Python 스크립트를 수동으로 실행하면 출력이 생성되고 Ctrl+를 누를 때까지 무기한으로 유지됩니다 D.
stderr
또한 stdout
이것이 차이를 만드는지 확인하기 위해 Python 스크립트 출력을 구성했습니다 . 다시 시작한 후에도 rsyslog
여전히 출력 파일이 없습니다.
체계:Ubuntu 20.04.2 LTS
rsyslogd:version 8.2001.0
rsyslog 구성:
module(load="omprog")
if $fromhost-ip == '10.200.25.5' then {
action(type="omfile"
file="/var/log/network")
action(type="omprog"
name="rsyslog_watch_vpn_attach"
binary="/usr/share/rsyslog/watch_syslog_vpn_attach.py"
confirmMessages="off"
output="/var/log/watch_vpn_attach.log")
stop
}
파일 /var/log/network
을 빌드하는 중입니다. 파일 /var/log/watch_vpn_attach.log
이 빌드되지 않았습니다.
내가 뭘 잘못하고 있는지 아는 사람 있나요?
답변1
이는 Python 프로그램의 버퍼링 문제일 수도 있습니다. 간단한 해결책은 flush=True
다음과 같은 인쇄 문을 추가하는 것입니다 .
#!/usr/bin/python3
import sys,time
for data in sys.stdin:
print(f"got data at {time.asctime()}: {data}",flush=True)