rsyslog
저는 데비안 버스터를 사용하고 있습니다.
나는 sysvinit
systemd가 아닌 이전 스타일을 사용하고 있습니다. rsyslog
대부분의 init 스크립트가 실행된 후 init 시작 시퀀스 후반에 시작되었습니다.
부팅 프로세스 중 메시지 dmesg
와 rsyslog가 시작되기 전에 실행되는 다른 시작 스크립트의 기타 이전 로그 메시지는 손실되지 않습니다. rsyslog
시작 시 즉시 기록됩니다.
rsyslog가 실행되지 않을 때 이러한 메시지는 어디에 저장됩니까?
초기 시작 메시지가 기록되지 않도록 rsyslog를 시작하기 전에 이 "캐시"를 지울 수 있습니까?
또는 더 나은 방법은 필터링하여 기본 syslog 파일에 기록되도록 할 수 있다는 것입니다.
*.* -/var/log/syslog
하지만 다른 하나는 로그인되어 있지 않습니다.
*.* |/dev/xconsole
업데이트 및 설명
내가 해결하려는 문제가 완전히 명확하지 않을 수도 있다는 것을 깨달았습니다. 따라서 상황에 대한 몇 가지 설명은 다음과 같습니다.
syslog
표준 로깅(예: ) 외에도 /var/log/syslog
에 동일한 정보를 기록하고 있으며 /dev/xconsole
데스크톱 세션에 사용자로 로그인하면 백그라운드에서 다음 명령을 사용합니다.
cat /dev/xconsole
이렇게 하면 내 배경에 새 로그가 나타나는 것을 즉시 볼 수 있습니다. 또한 일반 파일과 달리 /dev/xconsole
읽은 후에는 비워집니다. 그래서 로그아웃했다가 다시 로그인하면 이전 메시지는 표시되지 않고 새 메시지만 표시됩니다.
이제 문제는 부팅 후 커널 버퍼에 너무 많은 로그가 있어서 부팅 시 쓸모없는 디버그 초기 부팅 정보로 전체 용량을 rsyslog
채운다는 것입니다 ./dev/xconsole
제가 가장 관심을 갖는 것은 누락된 늦은 부팅 메시지입니다. 처음 실행 한 후에야 cat
/dev/xconsole
공간이 확보되고 새 메시지를 받을 수 있습니다.
나는 다음과 같은 추악한 해킹을 추가했습니다 /etc/rsyslog.conf
.
:msg, startswith, "\[ " stop
*.* |/dev/xconsole
이는 기본적으로 한자리 초 카운터로 시작하는 모든 초기 메시지를 삭제 [ 0.000000]
하지만 모든 후속 메시지를 허용합니다. [ 14.348189]
이것은 효과가 있지만 더러운 해결 방법이라고 생각합니다.
그렇다면 관심이 없는 초기 부팅 메시지를 어떻게 제거하고 유용한 init 부팅 스크립트 메시지를 기록할 수 있습니까?
답변1
프로세스는 syslog
일반적으로 다음 세 가지 소스에서 메시지를 가져옵니다.
- 응용 프로그램을 통해
/dev/log
- 포트 514를 통한 네트워크 연결
- 커널을 통해
/proc/kmsg
/dev/log
이제 첫 번째... 전통적으로 프로세스가 시작되기 전에 전송된 모든 애플리케이션은 syslogd
메시지를 잃게 됩니다. systemd
상황이 조금 혼란스럽기 때문에그것대신 이 소켓을 들을 수 있습니다. 그러면 syslogd
읽을 수 있습니다 systemd
. 하지만 그건 당신이 걱정할 문제가 아닌 것 같습니다.
두 번째 것은 분명히 귀하의 질문과 관련이 없습니다.
그래서 우리는 세 번째에 집중합니다. 다음은 로 시작하는 줄입니다 [...]
. 여기서 숫자는 시작 이후의 타임스탬프입니다. 이는 사용자 공간 응용 프로그램이 아닌 커널에 의해 생성된 메시지입니다.
커널 메시지는 "링 버퍼"에 저장되고 rsyslog
시작 시 이 버퍼를 읽어 구성 파일에 데이터를 넣으라고 지시한 위치에 데이터를 넣습니다.
일반적인 상황에서는 괜찮습니다. 무언가가 제대로 부팅되지 않는 경우를 대비해 모든 커널 부팅 메시지의 로그를 원합니다.
하지만 신경 쓰지 않는다면 이 명령을 사용할 수 있습니다 dmesg --clear
. 이렇게 하면 "링 버퍼"가 지워집니다. 따라서 부팅하기 전에 부팅 순서에 넣으면 rsyslog
데몬은 버퍼가 이미 지워진 커널 메시지를 읽지 않습니다.
지금어떻게수행하는 작업은 실행 중인 배포판에 따라 크게 달라집니다. 전통적인 방법을 사용하면 sysvinit
syslog 시작 스크립트 전에 실행되는 RC 파일을 생성해야 할 수도 있습니다. systemd를 사용하면 syslog 프로세스에 대한 전제 조건이 있는 유닛을 생성할 수 있습니다.
답변2
이 답변은 아마도 매우 늦었고 OP에 더 이상 필요하지 않을 수 있지만 다른 사람들에게 도움이 될 수 있습니다.
Stephen Harris의 대답은 매우 훌륭하지만 OP와 마찬가지로 dmesg --clear
나에게는 효과가 없는 것 같습니다. 그러나 시작하기 전에 /proc/kmsg
이와 같은 내용을 읽는 것만으로도 작업이 완료됩니다.cat /proc/kmsg > /dev/null
rsyslog
참고: 댓글에 답변을 드리고 싶지만 필요한 평판이 없습니다.
답변3
dmesg/kmsg에서 메시지를 지우는 것은 좋지 않은 생각이며 장기적으로 문제를 일으킬 수 있습니다. xconsole에서는 이러한 메시지가 표시되지 않을 수도 있지만 다른 로그에 저장되어 있을 때 디버깅하는 데 중요할 수 있습니다.
여기서 가장 좋은 해결책은 아마도 부팅 프로세스 초기, 즉 syslog가 시작된 후 어느 정도 시간이 지났지만 다른 "늦은 부팅 메시지"가 수집되기 전에 xconsole을 지우는 것입니다.
"지연된 부팅 메시지" 중 일부가 이 프로세스에 의해 소모된 경우, 파서를 정리에 추가하여 먹고 싶은 마지막 커널 라인 뒤에 오거나 정지하지 않은 첫 번째 커널 라인 뒤에 오도록 할 수 있습니다. 후반 단계 행을 삭제하고 싶지 않습니다.
이에 만족한다면 rsyslogd 바로 다음에 우선 순위를 지정하거나 rsyslogd init 스크립트에 추가하여 이 "xconsole Clear"를 삽입할 수 있습니다. 단, 업데이트로 변경 사항이 발생할 수 있습니다.