logrotate
및 를 포함한 다양한 Debian 패키지는 rsyslog
자체 로그 회전 정의를/etc/logrotate.d/
이러한 정의를 재정의하는 올바른 방법은 무엇입니까?
파일을 수정하면 시스템이 업데이트될 때마다 경고가 표시되며, 나(또는 다른 사람)가 잘못된 답변을 제공하거나 나(또는 다른 사람)가 수동으로 파일을 병합할 수 없으면 변경 사항이 손실될 위험이 있습니다. 새 로그 파일에 대한 새 업스트림 정의를 가져오지 못할 수도 있습니다. 이 두 가지 일이 지난 몇 년 동안 많이 일어났습니다.
00_*
또는 파일의 정의를 재정의하려고 시도했지만 zz_*
중복된 오류가 발생합니다.
error: zz_mail:1 duplicate log entry for /var/log/mail.log
error: found error in /var/log/mail.log , skipping
깨끗한 해결책이 있습니까? 매일 정의 파일에 변경 사항을 다시 적용하려면 cron 스크립트를 작성해야 합니까?
편집하다:rsyslog
더 명확하게 말하자면, 이상적으로는 로그 회전 정의 의 99%를 유지하고 APT를 사용하여 자동으로 업데이트하고 싶습니다 . 단일 정의 외에도 /var/log/mail.log
다른 순환 전략을 적용해야 합니다.
Logrotate가 중복 정의를 허용하고 파일당 첫 번째 또는 마지막 정의만 사용하면 내 문제가 해결될 것입니다. 정의를 의도적으로 이전 정의를 덮어쓰는 것으로 표시하는 옵션이 있다면 override
문제도 해결될 것입니다.
/etc/logrotate.d/rsyslog
하지만 아쉽게도 내 버전으로 모든 내용을 다루어야 할 것 같습니다 .nginx
답변1
먼저 다음과 같은 도구를 사용하는 것이 좋습니다.etckeeper
파일 변경 사항을 추적하고 /etc
업그레이드 중 데이터 손실을 방지합니다(다른 이점도 포함).
정의를 재정의하는 "올바른" 방법예구성 파일을 직접 편집합니다. 따라서 dpkg
구성 파일로 수행할 작업을 알고 있으며 업그레이드 시 변경 사항이 적용될 때 메시지가 표시됩니다. 불행하게도 여러분도 알고 있듯이 이는 이상적이지 않습니다.
특정 구성 문제를 데비안 친화적인 방식으로 실제로 해결하려면 메일 메시지를 실제로 다른 로그 파일에 기록하고 설정하는 것이 좋습니다.저것~ 에 누워 있다 logrotate
:
- 새 로그 파일을
/etc/rsyslog.d
가리키는 새 로그 구성 파일을 에 추가합니다 .mail.*
예를 들어/var/log/ourmail.log
(사용하고 있다고 가정rsyslog
- 적절하게 변경); /var/log/ourmail.log
새 구성 파일에서 구성합니다logrotate
.
여기에는 새 구성 파일 추가만 포함되므로 업그레이드 문제는 없습니다. 기존 로그 파일은 기본 구성을 사용하여 계속 생성되고 순환되지만 로그 파일은 구성을 따릅니다.
답변2
데비안에서 배포 기본값과 다른 구성/바이너리 파일의 복사본을 유지하는 한 가지 방법은 파일을 "전송"하는 것입니다. 예를 들어 deb 패키지의 새 버전을 설치/업데이트할 때 패키지 관리자에게 특정 파일을 다른 디렉터리에 설치하도록 지시합니다.
dpkg-divert
나는 BIND와 ISC-DHCP의 init.d sys V 래퍼를 보존하기 위해 수년 동안 이 기능을 사용해 왔습니다. 이 래퍼는 DNS 및 DHCP 구성 파일의 일관성을 확인하고 서비스가 다시 시작될 때 변경된 파일 영역을 자동으로 증가시킵니다. 일련 번호가 바인딩됩니다.
또한 nfsen 서버에서 이것을 사용하여 deb 패키지 버전 대신 바이너리 버전을 컴파일된 상태로 유지합니다.
이렇게 하면 원하는 대로 원래 위치를 수정할 수 있습니다.
아마도 나는 너무 많은 시스템을 원하는 대로 관리하고 파일 시스템 구성의 표준 위치를 변경했습니다. 따라서 좀 더 난해한 구성에서 이 기능을 사용하려면 수정 사항이 짓눌리는 것을 원하지 않지만 여전히 가능하고 싶습니다. 업그레이드 혜택에서 이를 사용하세요.
데비안에서 기본적으로 전송하는 데 사용하는 파일이 이미 있을 수도 있습니다. 다음 명령을 사용하여 해당 파일을 나열하세요:
dpkg-divert --list
~에서man dpkg-divert
예
To divert all copies of a /usr/bin/example to /usr/bin/example.foo, i.e. directs all packages providing /usr/bin/example to install it as /usr/bin/example.foo, performing the rename if required: dpkg-divert --divert /usr/bin/example.foo --rename /usr/bin/example To remove that diversion: dpkg-divert --rename --remove /usr/bin/example To divert any package trying to install /usr/bin/example to /usr/bin/example.foo, except your own wibble package: dpkg-divert --package wibble --divert /usr/bin/example.foo --rename /usr/bin/example To remove that diversion: dpkg-divert --package wibble --rename --remove /usr/bin/example
Debian-Administration.org 사이트도 참조하세요.dpkg-divert를 사용하여 바이너리 교체
분명히 이 지시어는 매우 유용하기는 하지만 남용하는 것은 권장하지 않습니다.
@Stephen Kitt의 주소는가능한구성 파일에 문제가 있습니다. 업그레이드가 전송된 파일에 영향을 미치고, 구성에 큰 변경 사항이 있는 경우(예: 새 Debian 버전으로 업그레이드할 가능성이 더 큰 경우) 데몬은 시작되지 않으며 이 상황은 수동으로 해결해야 합니다. 또한 공정하게 말하면 프로필을 전송하지 않고도 이런 일이 발생할 수 있습니다.
IMO 이것은 다른 Linux 배포판과 비교하여 dkpg-divert
Debian 패키지 관리자의 진정한 유연성을 보여주는 기능 중 하나입니다 .
답변3
Stephen이 말했듯이 구성 파일을 직접 편집해야 하지만 그렇다고 사용자 정의 지시문을 거기에 넣어야 한다는 의미는 아닙니다.
편집 /etc/logrotate.d/rsyslog
자신의 재정의 지시문이 포함된 별도의 파일을 사용하여 기존 지시문 끝에 줄을 추가합니다.
/var/log/syslog
{
... existing directives ...
include /etc/logrotate.d/override/rsyslog
}
그런 다음 재정의 지시문만 포함하는 재정의 파일을 만듭니다.
/etc/logrotate.d/override/rsyslog
weekly
rotate 0
시스템 업그레이드 중에 여전히 주의가 필요하지만 패키지에서 제공하는 기본 구성을 다시 패치하는 것은 매우 간단합니다. 한 줄만 추가하면 됩니다.
나에게 이는 적어도 시스템 표준을 준수하고 명확하며 이해하기 쉽게 유지하면서 시스템을 업그레이드할 때마다 차이점을 수동으로 병합하지 않아도 되기 때문에 허용 가능한 절충안입니다.
답변4
다시 돌아가 프로필 변경 경고에 대해 생각해 보겠습니다. 왜 그것을 얻었고 그것은 무엇을 의미합니까? 이게 좋은 일인가요?
대부분의 경우 데비안과 함께 제공되는 기본 구성 파일은 주로 필요한 작업을 수행합니다. 두 가지 방법으로 변경할 수 있습니다. 즉, 관리자나 패키저가 변경합니다. 둘 중 하나는 정상적이고 예상되는 것입니다. 그러나 둘 다 사실인 경우 올바른 접근 방식은 무엇입니까? 이상적으로는 둘 다 동일한 변경을 수행하고 병합할 수 있지만 이마저도 하기 어렵고 이런 일이 발생하는 것을 본 적이 없습니다. 대부분의 경우 패키저의 변경 사항을 기록하고 이를 한 줄씩 수락, 병합 또는 거부해야 합니다. 지금까지 제한된 방식으로 이를 수행하는 방법은 단 한 가지뿐입니다. 즉, 간단한 방법으로 추가 콘텐츠를 추가할 수 있지만 변경하거나 제거할 수 없으며 여전히 유용하지 않은 조각의 디렉터리를 구성하는 것입니다. 중대한 변경이 발생하면 예상대로 경고를 받아들이고 진지하게 받아들이고 시간을 들여 변경 사항을 비교하여 올바른 일을 하십시오.
즉, 귀하의 특정 경우(사소한 변경이므로) 문제의 조각을 비활성화하고(모든 읽기 권한을 취소하거나 전송하거나 이름을 변경하여) 다른 이름으로 새 조각을 만듭니다. 백업이 좋은 것이므로 etckeeper를 사용하는 것이 좋습니다.