루트가 아닌 소유권으로 인해 Logrotate가 더 이상 심볼릭 링크 된 구성 파일을 읽지 않습니다. 온 레일즈 애플리케이션 서버에서

우리는 현재 루비 온 레일즈 애플리케이션 서버에서 우분투 12.04 LTS에서 14.04 LTS로 업그레이드하고 있으며 로그 파일이 더 이상 회전하지 않는 것을 발견했습니다.

두 머신 모두 다음과 같이 유효한 logrotate 파일을 포함하는 /var/app-name/config/logrotate유닉스 사용자 deployer가 소유 한 파일이 있습니다.

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

그런 다음 /etc/logrotate.d/디렉토리로 심볼릭 링크 됩니다app-name

우리의 우분투 12.04 서버에는 3.7.8의 로그 로테이션이 있습니다. var/app-name/log/디렉토리 로 이동하여 모든 로그 파일을 회전시킵니다.

그러나 Ubuntu 14.04 서버에는 응용 프로그램의 로그 파일을 회전시키지 않는 3.8.7의 logrotate가 있습니다.

내가 이것을 통해 디버깅 sudo logrotate -d -f /etc/logrotate/.conf하면 다음과 같은 결과가 나옵니다.

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

코드에서 이것을 쫓아 내면 3.8.x 릴리스 스트림에 다음 변경 사항이 추가 된 것 같습니다 : https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

내가 변경하는 경우 파일의 소유권에이 심볼릭 링크 /var/app-name/config/logrotate하는 root다음 작업을 다시 시작합니다. 그러나이 파일이 내 응용 프로그램의 일부 이며이 상태에서 사용하는 capistrano 배포 프레임 워크에 의해 생성되었으므로 제대로 작동하는 데 소유권을 변경하지 않아도됩니다.

그래서 symlinked 설정 파일은 logrotate에 의해 권장 / 지원됩니까?

그렇다면 디렉토리에 deployer링크 된 내 파일 (소유자 ) 을 사용하는 것을 거부해야 /etc/logrotate.d합니까? 버그로 보입니까?

또는 응용 프로그램 별 로그 회전에 대해 권장되는 다른 방법이 있습니까?

( 유닉스 StackExchange 에도 요청 )



답변

문제는 logrotate 구성 파일이 모든 명령을 루트로 실행할 수 있다는 것입니다 (prerotate / postrotate 스탠자를 사용). 따라서 deployer에있는 파일에 대한 쓰기 권한을 부여 하여 사용자에게 루트 권한을 효과적으로 부여 할 수 있습니다 /etc/logrotate.d/. 아니, 버그가 아닙니다.

배포자 사용자를 신뢰하는 경우 파일에 복사 할 sudo 권한을 부여하여 문제를 해결할 수 있다고 생각합니다 /etc/logrotate.d/. 물론 배포자 사용자가 웹앱이 실행되는 사용자와 동일하지 않다고 가정합니다.


답변

나는 파티에 늦었다는 것을 알고 있지만 비슷한 문제가 발생하여 해결책을 공유 할 것이라고 생각했습니다.

logrotate내가 작성한 구성을 읽을 수 없을 때 문제가 시작되었습니다 . 배포 사용자가 무엇이든 루트 액세스 권한을 가지지 않기 위해 루트가 소유 한 폴더에 새 구성을 배포하고 싶지 않았습니다 .

처음 logrotate에는 배포 사용자 로 실행하려고했지만 에서 상태 파일에 액세스하는 것에 대해 불평했습니다 /var/lib/logrotate/state. 그런 다음 맨 페이지를 읽습니다. 사용하는 상태 파일을 지정할 수 있습니다 logrotate! 따라서 logrotate사용자 지정 상태 파일을 사용하여 배포 사용자 로 실행 되도록 매일 cron을 설정하는 것이 더 나은 솔루션 인 것 같습니다 . 이런 식으로 배포 사용자 나 응용 프로그램에 루트 액세스가 필요하지 않습니다.

상태 파일을 지정하는 방법은 다음과 같습니다.

logrotate --state /path/to/status /path/to/custom_logrotate.conf

이제 원하는 모든 사용자 및 구성 소유자로 logrotate를 실행할 수 있습니다!