저는 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
이 동작을 일관되게 유지하기 위해 노력하고 있습니다.
보충 설명
ls -1 /var/log
실행 보드에syslog
다음 파일을 포함합니다messages
.messages messages.1 messages.2 messages.2.gz messages.3 messages.4 messages.5 messages.6 messages.7
ls -1 /var/log
실행 보드에syslog-ng
다음 파일을 포함합니다messages
(messages
알림 누락).messages.1 messages.2 messages.3 messages.4 messages.5 messages.6 messages.7
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-ng
logrotate
견본/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
질문에 표시된 내용이 포함된 파일이 있습니다.
앞으로 새로운 것을 발견하면 돌아와서 이 답변을 업데이트하겠습니다.