[리눅스] 서버 로그 관리

yeop·2023년 7월 5일

스프링 로그

스프링에서는 로그를 관리하기 위해서 application.propertieslogback-spring.xml 파일을 사용한다. 전자의 경우 로그 레벨 설정과 같은 간단한 설정밖에 하지 못하기 때문에 특정 비즈니스 로직별, 일자별과 같이 자세한 설정을 위해서는 logback-spring.xml을 사용해야 한다.

Logback

Logbacklog4j를 발전시킨 Logging Framework로 Spring Boot는 spring-boot-starter-web -> spring-boot-starter-logging에 logback 구현체가 포함되어 있다.
그래서 의존성을 따로 추가하지 않아도 logback이 기본 로깅 구현체로 자동 적용된다.

이렇게 적용된 로깅 구현체는 SLF4J(Simple Logging Framework for JAVA : interface)와 compile시에 바인딩된다.

Log Level

로그 레벨은 5가지로 구성되며 오른쪽으로 갈수록 단계가 높아진다.

Trace ➡ Debug ➡ Info ➡ Warn ➡ Error

리눅스 서버 로그 관리

먼저 로그 관리의 기본인 로테이션이라는 용어부터 정리해보자

로테이션

  • 로그 로테이션의 경우, 시스템이나 애플리케이션에서 생성되는 로그 파일이 일정 크기에 도달하거나 일정 시간이 지나면 새로운 로그 파일을 생성하고 오래된 로그 파일을 압축, 아카이빙, 또는 삭제하는 프로세스를 말합니다.

  • 예를 들어, 로그 파일이 일주일마다 로테이션이 설정되어 있다면, 매주 새로운 로그 파일이 생성되고 이전 주의 로그 파일은 아카이빙되거나 삭제될 것이다. 이렇게 함으로써 로그 파일이 무한정 커지는 것을 방지하고, 디스크 공간을 효율적으로 활용하며, 로그 데이터를 쉽게 관리할 수 있다.


현재 나의 EC2 서버는 Nginx, Docker(WAS:Tomcat)으로 이루어져 있다.

Nginx

/etc/nginx/nginx.conf

  • 로그 파일의 저장 경로와 로그 출력 형식을 지정할 수 있다.

  • 로그 출력 형식 Default

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

    192.0.2.1 - john [10/Jul/2023:14:02:39 +0900] "GET /index.html HTTP/1.1" 200 555 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"

    • $remote_addr: 클라이언트의 IP 주소를 나타낸다.
    • $remote_user: 인증된 사용자의 이름을 나타낸다.
    • $time_local: 로컬 시간을 나타냅니다. 이는 접속 시간을 나타낸다.
    • $request: 클라이언트의 원래 요청 문자열을 나타낸다. 이는 사용자가 요청한 URL 및 HTTP 메서드(GET, POST 등)을 나타낸다.
    • $status: 요청에 대한 응답의 HTTP 상태 코드를 나타낸다.
    • $body_bytes_sent: 응답 본문의 바이트 크기를 나타낸다.
    • $http_referer: 클라이언트 HTTP 헤더의 Referer 필드를 나타낸다. 이는 사용자가 해당 요청을 하기 이전에 방문했던 웹페이지의 URL을 나타낸다.
    • $http_user_agent: 클라이언트 HTTP 헤더의 User-Agent 필드를 나타낸다. 이는 클라이언트의 브라우저, 운영 체제 등의 정보를 나타낸다.
    • $http_x_forwarded_for: 클라이언트 HTTP 헤더의 X-Forwarded-For 필드를 나타낸다. 이는 프록시나 로드 밸런서를 통해 서버에 도달한 요청의 경우, 원래 클라이언트의 IP 주소를 나타낸다.

/etc/logroate.conf

  • Linux 시스템에서 로그 파일 로테이션(자동 로그 관리)을 제어하는 설정 파일이다. 이 파일의 설정에 따라, 로그 파일의 크기가 일정 크기에 도달하거나 일정 시간이 경과하면 새로운 로그 파일을 생성하고, 오래된 로그 파일을 삭제하거나 압축하는 작업을 수행한다.

  • /etc/logrotate.conf 설정 파일에는 전역 설정을 포함하고, /etc/logrotate.d/ 디렉토리에는 개별 서비스(예: apache, nginx 등)에 대한 로그 로테이션 설정 파일이 위치해 있다.

  • /etc/logroate.conf/nginx

    • Default 값

      /var/log/nginx/*.log {
      create 0640 nginx root
      daily
      rotate 10
      missingok
      notifempty
      compress
      delaycompress
      sharedscripts
      postrotate
          /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
      endscript
      }

      /var/log/nginx/*.log { ... }: 이 설정이 적용될 로그 파일을 지정합니다./var/log/nginx/ 디렉토리 내의 모든 .log 파일에 이 설정이 적용됩니다.

      create 0640 nginx root: 로그 파일을 로테이션한 후 새 로그 파일을 생성합니다. 생성될 파일의 권한은 0640이며, 소유자는 'nginx', 그룹은 'root'입니다.

      daily: 로그 파일을 매일 로테이션합니다.

      rotate 10: 로그 파일을 최대 10개까지 유지합니다. 10개가 넘으면 가장 오래된 로그 파일부터 삭제됩니다.

      missingok: 로그 파일이 없을 경우 에러를 무시하고 넘어갑니다.

      notifempty: 로그 파일이 비어있는 경우 로테이션하지 않습니다.

      compress: 로테이션된 로그 파일을 gzip으로 압축합니다.

      delaycompress: 로테이션된 이전 로그 파일의 압축을 지연합니다. 이는 compress 옵션과 함께 사용될 때 유용하며, 프로그램이 로그 파일을 쓰는 중에 발생하는 에러를 방지해줍니다.

      sharedscripts: 로그 파일 모두에 대해 postrotate와 endscript 사이의 스크립트를 한 번만 실행합니다.

      postrotate ... endscript: 로그 파일을 로테이션한 후에 실행할 쉘 스크립트를 지정합니다. 이 스크립트는 Nginx에 USR1 시그널을 보내 로그 파일을 재오픈하라는 명령을 내립니다. 이는 Nginx가 현재 로그 파일을 계속 사용하는 것을 방지하며, 새로운 로그 파일에 로그를 기록하도록 합니다.

Logrotate

logrotate는 일반적으로 cron이라는 리눅스의 작업 스케줄러를 통해 주기적으로 실행된다.

리눅스 배포판에 따라 다르지만, 일반적으로 /etc/cron.daily 또는 /etc/cron.weekly 등의 디렉토리에 logrotate를 주기적으로 실행하는 스크립트가 포함되어 있다. 이 스크립트는 시스템이 부팅될 때 cron에 의해 자동으로 스케줄링된다.

  • logrotate -f와 같은 명령은 로그 파일의 로테이션을 즉시 강제로 실행할 때 사용되며, 일반적으로 디버깅이나 테스트, 또는 디스크 공간을 즉시 확보해야 할 경우에 사용된다.

0개의 댓글