Ubuntu 22.04에서 Logrotate를 사용하여 로그 파일 관리하는 방법

소개

Logrotate는 로그 파일의 자동 회전과 압축을 관리하는 시스템 유틸리티입니다. 로그 파일이 회전되고 압축되지 않고 주기적으로 가지치기되지 않으면 결국 시스템의 모든 사용 가능한 디스크 공간을 소비할 수 있습니다.

Logrotate는 Ubuntu 22.04에 기본으로 설치되어 있으며 rsyslog와 같은 기본 시스템 로그 프로세서를 포함한 모든 설치된 패키지의 로그 회전 요구를 처리하도록 설정되어 있습니다.

본 문서에서는 기본 Logrotate 구성을 탐색한 다음 가상의 사용자 정의 응용 프로그램을 위해 로그 회전을 구성할 것입니다.

전제 조건

이 튜토리얼은 Ubuntu 22.04 서버에 비루트 sudo 활성화된 사용자가 있다고 가정합니다. 이 사용자는 Ubuntu 22.04에서 초기 서버 설정에서 설명한 것처럼 설정되어 있습니다.

Logrotate는 다른 많은 리눅스 배포판에서도 사용할 수 있지만 기본 구성은 상당히 다를 수 있습니다. Logrotate 버전이 Ubuntu 22.04와 유사하면이 튜토리얼의 다른 섹션은 여전히 적용됩니다. Logrotate 버전을 확인하려면 단계 1을 따르세요.

시작하려면 sudo가 활성화된 사용자로 서버에 로그인하십시오.

단계 1 — Logrotate 버전 확인

Logrotate는 기본적으로 Ubuntu에 설치되어 있습니다. 그러나 설치해야 하는 경우 패키지 목록을 업데이트하고 패키지를 가져오기 위해 다음 명령을 실행합니다:

  1. sudo apt update
  2. sudo apt install logrotate

Ubuntu 서버를 사용하는 경우 Logrotate가 설치되어 있는지 확인하려면 다음 명령을 사용하여 버전 정보를 요청하십시오:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Logrotate가 설치되어 있지만 버전 번호가 크게 다른 경우, 이 튜토리얼에서 탐색되는 일부 구성 옵션에 문제가 있을 수 있습니다. Logrotate의 특정 버전에 대한 문서를 참조하여 해당하는 설정을 확인하십시오. 이를 위해 Logrotate의 매뉴얼 페이지 (man)를 읽어야 합니다:

  1. man logrotate

온라인 버전의 Logrotate 문서를 참고할 수도 있습니다. 다음으로 Ubuntu에서 Logrotate의 기본 구성 구조를 살펴보겠습니다.

단계 2 — Logrotate 구성 탐색

일반적으로 Ubuntu에서 Logrotate의 구성 정보는 두 군데에서 찾을 수 있습니다:

  • /etc/logrotate.conf: 이 파일에는 몇 가지 기본 설정이 포함되어 있으며 시스템 패키지가 소유하지 않은 몇 가지 로그에 대한 회전을 설정합니다. 또한 /etc/logrotate.d 디렉토리의 모든 파일에서 구성을 가져 오기위한 include 문을 사용합니다.
  • /etc/logrotate.d/: 로그 회전을 도와야하는 설치된 패키지가 배치하는 위치입니다. 표준 설치에서는 apt, dpkg, rsyslog 등과 같은 핵심 시스템 도구에 대한 파일이 이미 여기에 있어야합니다.

logrotate.conf는 기본적으로 주간 로그 회전을 구성하며, root 사용자와 syslog 그룹이 소유한 로그 파일이며, 한 번에 네 개의 로그 파일이 유지되고(rotate 4), 현재 파일이 회전된 후에 새로운 빈 로그 파일이 생성됩니다(create).

/etc/logrotate.d에서 패키지의 Logrotate 구성 파일을 살펴 봅시다. apt 패키지 유틸리티를위한 파일을 cat합니다:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

이 파일에는 /var/log/apt/ 디렉토리의 두 가지 다른 로그 파일에 대한 구성 블록이 포함되어 있습니다: term.loghistory.log. 두 옵션 모두 동일합니다. 이 구성 블록에 설정되지 않은 옵션은 기본값이나 /etc/logrotate.conf에 설정된 값이 상속됩니다. logrotate 파일에서 설정된 설정은 /etc/logrotate.conf에 구성된 logrotate의 기본값을 재정의합니다. apt 로그에 설정된 옵션은:

  • rotate 12: 이전 로그 파일을 12개 유지합니다. 이것은 기본적으로 rotate 4를 덮어씁니다.
  • monthly: 한 달에 한 번 로테이트합니다. 이것은 기본적으로 weekly를 덮어씁니다.
  • compress: 로테이트된 파일을 압축합니다. 이것은 기본적으로 gzip을 사용하며 파일 확장자는 .gz입니다. 압축 명령은 compresscmd 옵션을 사용하여 변경할 수 있습니다.
  • missingok: 로그 파일이 없으면 오류 메시지를 작성하지 않습니다.
  • notifempty: 로그 파일이 비어 있으면 로테이트하지 않습니다.

이러한 구성 파일은 기본적으로 새로운 로그를 생성하도록 Logrotate에 지시하는 기본 create 동작을 상속받습니다. 이는 nocreate로 재정의될 수 있으나, 이렇게 하면 대부분의 다른 기능이 비활성화됩니다.

더 많은 구성 옵션이 있습니다. 모든 옵션에 대해 알아보려면 명령 줄에서 man logrotate를 입력하여 Logrotate의 매뉴얼 페이지를 열어보세요.

다음으로, 가상의 서비스인 your-app의 로그를 처리하기 위한 구성 파일을 설정하겠습니다.

단계 3 — 예제 구성 설정하기

미리 패키지화되어 사전 구성된 시스템 서비스 외의 응용 프로그램에 대한 로그 파일을 logrotate를 사용하여 관리하는 경우 두 가지 옵션이 있습니다:

  1. /etc/logrotate.d/에 새 Logrotate 구성 파일을 만들어서 저장하세요. 이 파일은 매일 root 사용자로 실행되며 다른 표준 Logrotate 작업과 함께 실행됩니다.
  2. Ubuntu의 기본 Logrotate 설정 밖에서 새 구성 파일을 만들고 실행하세요. 이것은 Logrotate를 root 사용자가 아닌 사용자로 실행해야 할 때 또는 로그를 매일 이상 자주 회전시키려는 경우에만 실제로 필요합니다 (/etc/logrotate.d/hourly 구성을 추가해도 시스템의 Logrotate 설정이 하루에 한 번만 실행되기 때문에 효과가 없습니다).

이 두 가지 옵션을 예제 설정과 함께 살펴보겠습니다.

/etc/logrotate.d/에 구성 추가

우리는 가상의 웹 서버를 구성하여 /var/log/your-app/access.logerror.log를 생성합니다. 이는 www-data 사용자와 그룹으로 실행됩니다.

/etc/logrotate.d/your-app 로그 파일에 대한 구성을 추가하려면 먼저 nano나 기호에 따라 선호하는 편집기에서 /etc/logrotate.d 디렉토리에 새 파일을 엽니다:

  1. sudo nano /etc/logrotate.d/your-app

새 구성 파일에 다음 줄을 추가하세요:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

이 파일의 일부 새로운 구성 지시문은:

  • create 0640 www-data www-data: 이 명령은 지정된 권한(0640), 소유자(www-data), 그리고 그룹(또한 www-data)으로 로테이션 후에 새로운 빈 로그 파일을 생성합니다.
  • sharedscripts: 이 플래그는 설정에 추가된 모든 스크립트가 각 파일의 로테이션마다 실행되는 대신 한 번만 실행됨을 의미합니다. 경로 /var/log/your-app/*.log에 와일드카드 *가 포함되어 있기 때문에 이 구성은 your-app 디렉토리에 있는 여러 개의 로그 파일과 일치합니다. sharedscripts 옵션이 없으면 postrotate에 지정된 스크립트는 이 옵션이 없는 로그 파일을 처리할 때마다 실행됩니다.
  • postrotate에서 endscript까지: 이 블록에는 로그 파일이 로테이션된 후에 실행할 스크립트가 포함됩니다. 이 경우 우리는 예제 앱을 다시 로드하고 있습니다. 이것은 때로는 응용 프로그램을 새로 생성된 로그 파일로 전환하기 위해 필요합니다.
    postrotate가 로그가 압축되기 전에 실행됨을 유의하십시오. 압축은 오랜 시간이 걸릴 수 있으며 소프트웨어는 즉시 새로운 로그 파일로 전환해야 합니다. 로그가 압축된 후에 실행해야 하는 작업에 대해서는 대신 lastaction 블록을 사용하십시오.

nano에서 저장 및 종료하려면 Ctrl+X를 누르고, 프롬프트가 나타나면 Y를 입력한 후 Enter를 누르십시오. 구성 파일을 테스트하려면 다음과 같이 드라이런을 실행할 수 있습니다:

  1. sudo logrotate /etc/logrotate.conf --debug

이 명령은 logrotate를 호출하고, 표준 구성 파일을 가리키며, 디버그 모드를 켜는 것입니다.

로그회전이 처리하는 로그 파일 및 로그회전이 수행하는 작업에 대한 정보가 인쇄됩니다. 모든 것이 잘 보인다면 완료됩니다. 표준 로그회전 작업은 하루에 한 번 실행되며 새 구성이 포함됩니다.

다음으로, 우분투의 기본 구성을 전혀 사용하지 않는 설정을 시도해 보겠습니다.

단계 4 — 독립 로그회전 구성 작성

이 예제에서는 사용자 sammy로 실행되는 앱이 있으며 /home/sammy/logs/에 저장된 로그를 생성합니다. 이러한 로그를 매 시간 회전시키고 싶으므로 우분투에서 제공하는 /etc/logrotate.d 구조 외부에 이를 설정해야 합니다.

먼저 홈 디렉터리에 구성 파일을 만듭니다. 텍스트 편집기에서 엽니다:

  1. nano /home/sammy/logrotate.conf

다음으로 다음 구성을 붙여넣습니다:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

파일을 저장하고 닫습니다. 이전 단계에서 이러한 옵션들을 모두 만났지만, 간략히 요약하면 이 구성은 파일을 매 시간 회전시키고, 이전 로그를 압축하여 보존하고, 회전된 파일을 대체하는 새 로그 파일을 생성합니다.

응용 프로그램에 맞게 구성을 사용자 정의해야 하지만, 이것은 좋은 시작점입니다.

구성이 작동하는지 테스트하려면 로그 파일을 만들어 봅시다. 먼저 cd ~ 명령을 사용하여 사용자의 홈 디렉터리로 이동합니다. 그런 다음 mkdir 명령을 사용하여 로그를위한 디렉토리를 만듭니다. 마지막으로 touch 명령을 사용하여 logs 디렉토리에 빈 파일을 만듭니다. 이러한 단계를 완료하려면 다음 명령을 실행하십시오:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

이제 올바른 위치에 빈 로그 파일이 있으므로 logrotate 명령을 실행해 봅시다.

sammy가 소유한 로그이기 때문에 sudo를 사용할 필요가 없습니다. 그러나 logrotate가 실행된 마지막 시간에 찾은 내용과 취한 조치를 기록하는 상태 파일을 지정해야 합니다. 이 상태 추적은 기본 /etc/logrotate.conf 구성을 사용할 때 자동으로 처리됩니다. 상태 파일은 /var/lib/logrotate/status에 저장됩니다. 기본 구성을 사용하지 않으므로 상태 파일 위치를 수동으로 구성해야 합니다.

이 예제에서는 Logrotate가 상태 파일을 직접 홈 디렉토리에 넣도록 합니다. 접근 가능하고 편리한 곳이라면 어디든지 상관 없습니다. 다음 명령을 실행하여 만든 /home/sammy/logrotate.conf를 사용하고 logrotate가 만나는 상태를 기록합니다:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

--verbose 플래그는 Logrotate가 수행하는 작업에 대한 자세한 정보를 출력합니다. 이 경우 어떤 로그 파일도 회전하지 않았습니다. 이것은 Logrotate가 이 로그 파일을 처음 만나며 0시간이 지났으므로 회전되지 않아야 합니다.

상태 파일을 cat 유틸리티를 사용하여 검토하면 Logrotate가 실행에 대한 일부 정보를 기록했다는 것을 알 수 있습니다.

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate는 보았던 로그 및 마지막으로 회전을 고려한 시간에 대한 정보를 기록했습니다. 이와 같은 명령을 한 시간 뒤에 다시 실행하면 로그가 예상대로 회전됩니다.

그렇지 않을 때 로그 파일을 회전시키려면 --force 플래그를 사용하십시오:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

이는 postrotate 및 기타 스크립트를 테스트할 때 유용합니다.

마지막으로, Logrotate를 매 시간 실행할 크론 작업을 설정해야 합니다. 사용자의 크론탭을 엽니다:

  1. crontab -e

이것은 텍스트 파일을 엽니다. 크론을 사용하는 것이 처음이라면 기본 텍스트 편집기를 선택하라는 메시지가 표시될 수 있습니다. 기본값이 없는 경우 새 사용자를 위해 nano를 권장합니다. 파일에는 이미 크론 구문을 설명하는 주석이 있을 수 있습니다. 파일의 끝에 새로운 빈 줄로 커서를 이동하고 다음을 추가하십시오:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

이 작업은 매 시간 14분에 매일 실행됩니다. 이전에 실행한 것과 거의 동일한 logrotate 명령을 실행하지만 logrotate를 안전하게 전체 경로인 /usr/sbin/logrotate로 확장했습니다. 크론 작업을 작성할 때 전체 경로를 사용하는 것이 좋은 실천입니다. 크론에 대해 자세히 알아보려면 다른 튜토리얼을 검토할 수 있습니다.

파일을 저장하고 나가십시오. 이렇게 하면 크론탭이 설치되고 지정된 일정에 따라 작업이 실행됩니다.

만약 1시간 후에 로그 디렉토리를 다시 방문하면 로테이션되고 압축된 로그 파일 access.log.1.gz (또는 --force 플래그와 함께 Logrotate를 실행했다면 .2.gz입니다).

결론

이 튜토리얼에서는 Logrotate 버전을 확인하고 기본 Ubuntu Logrotate 구성을 탐색하며 두 가지 다른 유형의 사용자 정의 구성을 설정했습니다. Logrotate에 대한 명령 줄 및 구성 옵션에 대해 자세히 알아보려면 터미널에서 man logrotate를 실행하거나 온라인 문서를 방문하십시오.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04