Buildroot: syslog-ng는 "/var/log/messages" 대신 "/var/log/messages.1" 파일에 기록합니다.

Buildroot: syslog-ng는 "/var/log/messages" 대신 "/var/log/messages.1" 파일에 기록합니다.

저는 Buildroot를 사용하여 임베디드 Linux 보드를 구축하고 있습니다(사용 설명서는 여기).

나는 그것을 syslog-ng보드에서 실행하고 있습니다. 해당 구성 파일은 buildroot에 지정됩니다.https://github.com/buildroot/buildroot/blob/master/package/syslog-ng/syslog-ng.conf:

@version: 3.37

source s_sys {
    file("/proc/kmsg" program_override("kernel"));
    unix-stream ("/dev/log");
    internal();
};

destination d_all {
    file("/var/log/messages");
};

log {
    source(s_sys);
    destination(d_all);
};

대상을 로 지정 "/var/log/messages"하지만 보드의 활동 로깅은 존재하지도 않는 /var/log/messages.1이라는 파일로 이동됩니다. /var/log/messages왜 그런 겁니까? /var/log/messages파일 에 로그인하는 방법이 있나요 ?

우리는 과거에 Syslog를 사용하여 로그인했으며 /var/log/messages이 동작을 일관되게 유지하기 위해 노력하고 있습니다.

보충 설명

  1. ls -1 /var/log실행 보드에 syslog다음 파일을 포함합니다 messages.
    messages
    messages.1
    messages.2
    messages.2.gz
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  2. ls -1 /var/log실행 보드에 syslog-ng다음 파일을 포함합니다 messages( messages알림 누락).
    messages.1
    messages.2
    messages.3
    messages.4
    messages.5
    messages.6
    messages.7
    
  3. syslog-ng보드 에서는 "활성" 파일을 tail -f /var/log/messages.1사용할 때 예상치 못한 기록된 메시지를 계속 수신하고 있음을 보여줍니다 .syslog/var/log/messages

답변1

해결되었습니다! syslog-ng각 로그 회전 후에 대상 로그 파일을 강제로 다시 열어야 합니다.

그래서 알아 냈습니다. @Murray Jensen에게 감사드립니다.여기에 대한 팁.

logrotate파일을 회전할 때마다 파일 /var/log/messages이름이 /var/log/messages.1. 다음 을 수행하려면 syslog-ng파일 이름을 /var/log/messages에서/var/log/messages.1아니요syslog-ng가 쓰는 파일 설명자가 이제 이름이 지정된 파일을 가리키도록 파일 설명자를 변경합니다 /var/log/messages.1.해결 방법은 로그 파일을 강제로 syslog-ng다시 열고 각 로그 회전 후에 새 파일 설명자를 가져오는 것입니다. 따라서 현재 존재하는 새로 생성된 대상 로그 파일에 대한 새 파일 설명자를 가져옵니다 /var/log/messages.

이를 수행하는 방법에는 3가지가 있습니다. 여기에 대해 썼습니다.https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-1270517815

syslog-ng-ctl reopen이것이 권장되는 방법이라는 것을 알게 된 곳은 여기를 참조하십시오 .https://github.com/syslog-ng/syslog-ng/issues/1774#issuecomment-346624252

이 3가지 방법은 다음과 같습니다.

# Option 0 (no longer recommended): call the heavier `reload` command after log
# rotation
syslog-ng-ctl reload

# Option 1 (RECOMMENDED): call the new `reopen` command after log rotation
syslog-ng-ctl reopen

# Option 2 (same thing as Option 1 above): send the `SIGUSR1` kill signal to the
# running `syslog-ng` process
pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid

따라서 logrotate모든 로그 회전 후에 위의 3가지 방법 중 하나가 자동으로 호출되도록 하려면 올바른 명령을 스크립트로 구성 파일(또는 유사한 이름으로 지정할 수 있음)에 추가해야 합니다 postrotate. 이제 수정된 logrotate 구성 파일은 다음과 같습니다./etc/logrotate.d/syslog-nglogrotate

내 메모에서:

견본/etc/logrotate.d/syslog-ng 로그 회전구성 파일:

/var/log/auth.log 
/var/log/user.log
/var/log/messages  
{
    rotate 7
    size 20M
    delaycompress
    missingok
    # Required for syslog-ng after each rotation, to cause it to reopen log
    # files so it can begin logging to the new log file under a new file
    # descriptor, rather than to the old log file which has now been rotated
    # and renamed. 
    postrotate
        # After rotating the log files, cause syslog-ng to reopen the
        # destination log files so it will log into the newly-created log files
        # rather than into the now-rotated and renamed ones.
        #
        # This ensures, for example, that syslog-ng will move its file
        # descriptor to begin logging into the main "/var/log/messages" log
        # file again, instead of into the now-rotated "/var/log/messages.1"
        # file, which the old file descriptor (fd) is now pointing to since
        # that fd's filename was just renamed from "/var/log/messages"
        # to "/var/log/messages.1" during the log rotation.

        # Option 1:
        syslog-ng-ctl reopen
        # OR, Option 2
        # pid="$(cat /var/run/syslog-ng.pid)" kill -SIGUSR1 $pid
    endscript
}

참고: 여기에서도 문서 변경 요청을 했습니다.https://github.com/syslog-ng/syslog-ng/issues/4166. 이제 syslog-ng-ctl reopen각 로그 회전 후에 syslog-ng-ctl reload.

이전 답변 시도(처음 시도한 답변)

보드 위를 달릴 때 syslog-ng나는rootfs(루트 파일 시스템) 이미지를 완전히 새로 고칩니다., 그리고마더보드를 다시 시작했습니다., 이제 /var/log/messages파일이 다시 표시됩니다.

부분 출력 ls -1 /var/log:

messages
messages.1
messages.2
messages.3
messages.4
messages.5
messages.6
messages.7

나는 그것을 설명할 수 없다. tail -f /var/log/messages예상대로 파일에 들어오는 활동 로그를 표시하고 tail -f /var/log/messages.1파일이 예상대로 새 메시지가 들어오지 않고 정적인 상태임을 보여줍니다.

syslog-ng다음 출력을 보면 보드가 실제로 실행되고 있음을 증명할 수 있습니다 ps aux | grep syslog.

# ps aux | grep syslog
  803 root      0:00 {syslog-ng} supervising syslog-ng
  804 root      0:02 /usr/sbin/syslog-ng
12571 root      0:00 grep syslog

...보드에서 실행될 때 동일한 명령의 출력과 반대입니다 syslog.

# ps aux | grep syslog
  789 root      0:19 /sbin/syslogd -n -n -s 0
 2993 root      0:00 grep syslog

다시 말하지만, 무슨 일이 일어났는지, 왜 일어났는지 잘 모르겠습니다.

두 보드 모두 실행 중임을 ps aux | grep logrotate표시합니다 logrotate. 전임자:

# ps aux | grep logrotate
 1299 root      0:00 runsv logrotate-periodically
14208 root      0:00 grep logrotate

두 보드 모두 동일한 /etc/logrotate.conf파일을 가지고 있으며, syslog-ng보드 에만 /etc/syslog-ng.conf질문에 표시된 내용이 포함된 파일이 있습니다.

앞으로 새로운 것을 발견하면 돌아와서 이 답변을 업데이트하겠습니다.

관련 정보