기록 중인 파일이 존재하지 않을 때 rsyslog 메시지가 손실되는 상황이 발생했습니다.
이것은 내 설정입니다.
- 로그 서버 192.168.1.2의 구성은 다음과 같습니다.
module(load="imtcp")
input(type="imtcp" port="514")
$template MyRemoteLog1,"/nfs/some/dir/%FROMHOST-IP%/%programname%/%$year%-%$month%-%$day%.log"
$template MyRemoteLog2,"/nfs/other/dir/%FROMHOST-IP%/%syslogfacility-text%.%syslogseverity-text%.%programname%.log"
$template MsgOnly,"%msg:2:$:%\n"
if $FROMHOST-IP== ['192.168.1.3'] AND $SYSLOGFACILITY-TEXT== ['local5'] then ?MyRemoteLog1;MsgOnly
& stop
if $FROMHOST-IP== ['192.168.1.3'] then ?MyRemoteLog2
& stop
- 로그 192.168.1.3을 보내는 클라이언트의 구성은 다음과 같습니다.
*.* @@192.168.1.2:514
- 또한 192.168.1.3의 구성을 이것으로 변경하려고 시도했지만 문제가 지속됩니다.
*.* action(type="omfwd"
Target="192.168.1.2"
Port="514"
resendlastmsgonreconnect="on"
action.resumeRetryCount="-1"
queue.filename="queue"
queue.size="100000"
queue.saveonshutdown="on"
Protocol="tcp" )
기본적으로 local5인 경우 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log에 저장하고 local5가 아닌 경우 /nfs/other/dir/192.168.1.3/user 로그 서버 .notice에 저장합니다. mytag.로그인
또한 내 설정은 nfs 마운트 디스크에 로그 파일을 기록합니다(중요한 경우).
문제는 이것이다:
- 시스템이 이미 실행 중입니다(로그가 기록되었습니다).
- 192.168.1.3(클라이언트)에서 다음을 실행합니다.
date | logger -p local5.debug -t mytag
- 192.168.1.2(서버)에서 새 파일 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log가 생성되었지만 내용이 비어 있습니다.
- 192.168.1.3(클라이언트)에서
date | logger -p local5.debug -t mytag
(다시) 실행합니다. - 192.168.1.2(서버)에서 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log 파일에 씁니다(4단계의 메시지가 기록되지만 2단계의 메시지는 손실됨).
- 192.168.1.2(서버)에서 파일을 삭제하고 다음과 같이 rsyslog 회전 스크립트를 실행합니다.
rm /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log ; /usr/lib/rsyslog/rsyslog-rotate
- 192.168.1.3(클라이언트)에서
date | logger -p local5.debug -t mytag
(다시) 실행합니다. - 192.168.1.2(서버)에서 새 파일 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log가 생성되었지만 내용이 비어 있습니다.
이 실험을 통해 파일이 아직 존재하지 않을 때는 생성은 되지만 내용은 기록되지 않는다는 것을 알 수 있을 것 같습니다. 왜 이런 일이 발생합니까?
처음에는 일반 TCP를 통한 rsyslog가 신뢰할 수 없고 RELP를 사용해야 할 수도 있기 때문일 수 있다고 생각했습니다. 하지만 그런 실험을 해본 결과 네트워크에 문제가 있는 것은 아닌 것 같습니다.
이것은 내 nfs 마운트입니다.
172.16.1.4:/some/dir/nfs_export on /nfs type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.16.1.4,mountvers=3,mountport=38559,mountproto=udp,local_lock=none,addr=172.16.1.4)
$DebugFile /tmp/rsyslogdebug.txt
config 및 config를 추가 $DebugLevel 1
하고 메시지 디버깅 후 다음 명령을 실행하여 rsyslog를 엽니다.
kill -USR1 `ps aux | grep rsyslog | tr -s ' ' | cut -d' ' -f2 | head -n1`
나는 다음과 같은 로그를 찾았습니다 /tmp/rsyslogdebug.txt
.
7792.776708768:main Q:Reg/w0 : omfile.c: omfile: file to log to: /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log
7792.779333692:main Q:Reg/w0 : errmsg.c: Called LogMsg, msg: error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted
7792.779415835:main Q:Reg/w0 : operatingstate.c: osf: MSG error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted: signaling new internal message via SIGTTOU: 'error during config processing: omfile: chown for file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' failed: Operation not permitted [v8.2001.0 try https://www.rsyslog.com/e/2207 ]'
7792.779567477:main thread : janitor.c: janitorRun() called
7792.779745372:main Q:Reg/w0 : errmsg.c: Called LogMsg, msg: error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message
7792.779812889:main Q:Reg/w0 : operatingstate.c: osf: MSG error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message: signaling new internal message via SIGTTOU: 'error during config processing: Could not open dynamic file '/nfs/some/dir/192.168.1.3/mytag/2022-03-15.log' [state -3000] - discarding message [v8.2001.0 try https://www.rsyslog.com/e/2207 ]'
답변1
메시지에서 프롬프트error during config processing: omfile: chown for file
나는 그 과정이 다음과 같이 진행될 것이라고 가정하고 있습니다.
- rsyslog는 파일이 존재하지 않는 경우 생성합니다(이미 존재하는 경우 3단계로 건너뛰기).
- 그런 다음 chmod를 실행하고 구성 파일에 정의된 사용자 및 그룹이 존재하지 않는 경우 해당 사용자 및 그룹에 chown합니다.
- 그런 다음 rsyslog는 파일에 쓰거나 추가합니다.
2단계에 도달하면 실패하고 소유자에게 파일을 남겨두기 syslog:syslog
때문에 후속 로그 메시지가 수신되면 3단계로 점프하여 메시지를 성공적으로 작성합니다. 그러면 첫 번째 메시지가 모두 삭제됩니다.
그러나 Ubuntu 20.04에서 제공하는 기본 구성은 다음과 같습니다.
$FileOwner syslog
$FileGroup adm
그래서 우쭐해지려고 해syslog:adm
구성을 다음으로 변경하면
$FileOwner syslog
$FileGroup syslog
오류가 더 이상 발생하지 않습니다.
하지만 아직 해결되지 않은 문제가 하나 있습니다:
- 이 유형의 오류는 기록 중인 디렉터리가 nfs 마운트 내부에 있을 때 발생합니다.
- 기록하는 디렉터리가 nfs 마운트 내부에 없으면 이러한 오류가 발생하지 않습니다.