파일이 존재하지 않으면 Rsyslog는 로그 메시지를 잃습니다.

파일이 존재하지 않으면 Rsyslog는 로그 메시지를 잃습니다.

기록 중인 파일이 존재하지 않을 때 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 마운트 디스크에 로그 파일을 기록합니다(중요한 경우).

문제는 이것이다:

  1. 시스템이 이미 실행 중입니다(로그가 기록되었습니다).
  2. 192.168.1.3(클라이언트)에서 다음을 실행합니다.date | logger -p local5.debug -t mytag
  3. 192.168.1.2(서버)에서 새 파일 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log가 생성되었지만 내용이 비어 있습니다.
  4. 192.168.1.3(클라이언트)에서 date | logger -p local5.debug -t mytag(다시) 실행합니다.
  5. 192.168.1.2(서버)에서 /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log 파일에 씁니다(4단계의 메시지가 기록되지만 2단계의 메시지는 손실됨).
  6. 192.168.1.2(서버)에서 파일을 삭제하고 다음과 같이 rsyslog 회전 스크립트를 실행합니다.rm /nfs/some/dir/192.168.1.3/mytag/2022-03-15.log ; /usr/lib/rsyslog/rsyslog-rotate
  7. 192.168.1.3(클라이언트)에서 date | logger -p local5.debug -t mytag(다시) 실행합니다.
  8. 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.txtconfig 및 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

나는 그 과정이 다음과 같이 진행될 것이라고 가정하고 있습니다.

  1. rsyslog는 파일이 존재하지 않는 경우 생성합니다(이미 존재하는 경우 3단계로 건너뛰기).
  2. 그런 다음 chmod를 실행하고 구성 파일에 정의된 사용자 및 그룹이 존재하지 않는 경우 해당 사용자 및 그룹에 chown합니다.
  3. 그런 다음 rsyslog는 파일에 쓰거나 추가합니다.

2단계에 도달하면 실패하고 소유자에게 파일을 남겨두기 syslog:syslog때문에 후속 로그 메시지가 수신되면 3단계로 점프하여 메시지를 성공적으로 작성합니다. 그러면 첫 번째 메시지가 모두 삭제됩니다.

그러나 Ubuntu 20.04에서 제공하는 기본 구성은 다음과 같습니다.

$FileOwner syslog
$FileGroup adm

그래서 우쭐해지려고 해syslog:adm

구성을 다음으로 변경하면

$FileOwner syslog
$FileGroup syslog

오류가 더 이상 발생하지 않습니다.

하지만 아직 해결되지 않은 문제가 하나 있습니다:

  • 이 유형의 오류는 기록 중인 디렉터리가 nfs 마운트 내부에 있을 때 발생합니다.
  • 기록하는 디렉터리가 nfs 마운트 내부에 없으면 이러한 오류가 발생하지 않습니다.

관련 정보