Heroku는 클라우드 플랫폼으로, 애플리케이션을 배포하고 관리하기에 편리합니다. Heroku에서는 다양한 종류의 Heroku log 를 제공합니다. 런타임 로그에는 애플리케이션 로그, 시스템 로그, API 로그, 애드온 로그가 포함되며, 빌드 로그는 애플리케이션 빌드 및 배포 중 생성된 로그를 의미합니다. Heroku log 의 Logplex는 로그를 수집하고 라우팅하는 역할을 하며, 실시간 로그 전달 시스템으로 동작합니다. Private Space Logging은 Shield Private Spaces에서만 사용할 수 있으며, 공간 수준에서 Heroku log 를 캡처하여 더 나은 데이터 거주지 제어와 일관된 로그 구성을 보장합니다. Heroku의 다양한 로그 기능을 통해 애플리케이션의 동작 상태를 모니터링하고, 문제 발생 시 원인을 파악할 수 있습니다.
Heroku Logs
Heroku log 는 크게 두 가지로 나뉩니다: 런타임 로그와 빌드 로그입니다.
Runtime Logs
런타임 로그는 애플리케이션이 실행되는 동안 발생하는 모든 기록입니다. Heroku는 다음과 같은 런타임 로그를 수집합니다:
- Application Logs : 애플리케이션 코드 및 의존성에서 생성된 로그입니다. (필터: –source app)
- System Logs : Heroku 인프라에서 생성된 로그입니다. 예를 들어, 프로세스 재시작, 웹 다이노 수면 및 기상, 오류 페이지 제공 등의 로그입니다. (필터: –source heroku)
- API Logs : 배포, 프로세스 스케일링, 유지보수 모드 전환 등 관리 작업에서 생성된 로그입니다. (필터: –source app –dyno api)
- Addon Logs : 애드온 서비스에서 생성된 로그입니다. 각 애드온마다 로그 필터 방법이 다를 수 있습니다.
Build Logs
빌드 로그는 애플리케이션을 빌드하고 배포하는 과정에서 생성된 로그입니다. 빌드가 성공했는지 실패했는지 등을 확인할 수 있습니다. Heroku 대시보드의 Activity 탭에서 빌드 로그를 확인할 수 있습니다.
- Log History Limits : Logplex는 로그 메시지를 저장하기보다는 수집하고 라우팅하는 역할을 합니다. Logplex는 최근 1,500줄의 통합 로그를 1주일간 보관합니다. 지속적인 로그 보관을 위해서는 로그 애드온을 사용하는 것이 좋습니다.
- Writing to Your Log : Heroku에서는 애플리케이션의 표준 출력(stdout) 또는 표준 오류(stderr)에 기록되는 모든 내용을 캡처합니다. 예를 들어, Ruby에서는
puts "Hello, logs!"
와 같이 로그를 작성할 수 있습니다. - View Logs : Heroku 로그는 Heroku CLI, 대시보드, 로깅 애드온, 또는 로그 드레인에서 확인할 수 있습니다. 실시간 로그 스트리밍을 위해
heroku logs --tail
명령어를 사용할 수 있습니다. - Heroku’s Log Format and Message Ordering : Heroku 로그는 타임스탬프, 소스, 다이노, 메시지로 구성됩니다. 타임스탬프는 로그 생성 시간과 날짜를 기록하며, 소스는 로그의 출처를 나타냅니다. 다이노는 로그를 생성한 서버 단위를, 메시지는 실제 로그 내용을 의미합니다. Logplex의 분산 아키텍처로 인해 로그 메시지가 순서대로 정렬되지 않을 수 있습니다.
Logplex
Heroku(Heroku log)의 Logplex는 애플리케이션과 Heroku 플랫폼의 다른 구성 요소에서 생성된 로그 항목을 수집하고 배포하는 역할을 합니다. Logplex는 이러한 로그 항목을 Logplex API와 Heroku 명령줄 도구를 통해 제공합니다. 분산 시스템인 Heroku에서는 여러 다이노에 분산된 로그를 수동으로 접근하면 애플리케이션 이벤트 스트림의 불완전한 뷰가 제공되고, 관련된 플랫폼 수준의 이벤트가 누락될 수 있습니다. Logplex는 이러한 문제를 접근 가능하고 확장 가능한 방식으로 해결합니다.
Sources and Drains
Logplex는 소스에서 드레인으로 메시지를 라우팅합니다.
- 로그 소스는 애플리케이션과 관련된 로그 항목을 생성하려는 모든 프로세스를 의미합니다. 예를 들어, 웹 다이노, Heroku 플랫폼, Heroku 라우팅 스택, 다양한 애드온 등이 있습니다.
- 로그 드레인은 애플리케이션 로그를 소비하려는 네트워크 서비스를 의미합니다. 이는 자동 처리, 아카이브 또는 사람이 읽을 수 있도록 로그를 소비합니다. 예로는 Heroku 명령줄 도구와 여러 로그 처리 및 관리 애드온이 있습니다.
Best-effort Delivery
- Logplex는 로그 저장이 아닌 고성능 실시간 로그 전달 시스템입니다. 제한된 로그 항목 버퍼를 유지합니다.
- Logplex는 다양한 외부 도구 및 서비스와 직접 상호작용하며, 실시간 처리를 위해 신속한 대응이 필요합니다. 이러한 서비스 중 하나가 따라잡기 힘들다면 Logplex는 일정 시간 동안 로그 항목을 폐기할 수 있습니다. 이 경우 Logplex는 일부 항목이 누락되었음을 나타내는 경고 항목을 삽입합니다.
Logplex Residency
- 공용 런타임의 로그는 애플리케이션이 실행되는 동일한 지역에서 라우팅됩니다. 예를 들어, 미국 지역에서 실행되는 애플리케이션의 로그는 미국 인프라를 통해 라우팅됩니다.
- Private Spaces의 애플리케이션 로그는 해당 공간 자체의 지역 내에서 유지됩니다. 예를 들어, 도쿄 공간의 애플리케이션 로그는 도쿄 인프라를 통해 라우팅됩니다.
- 엄격한 준수 요구사항을 가진 애플리케이션은 Shield Private Spaces에 배포할 수 있으며, 이 경우 로그는 Logplex 대신 Private Space Logging을 사용하여 라우팅됩니다.
Log Drains
Heroku(Heroku log)의 Logplex 로깅 서비스는 애플리케이션 로그를 수집하고, Heroku의 로깅 애드온 제공업체가 제공하는 아카이브, 검색 및 경고 서비스로 전달하는 기능을 제공합니다. 사용자가 직접 로그 드레인을 추가하여 애플리케이션 로그를 처리하는 방식을 완전히 제어할 수도 있습니다.
Syslog Drains
- Syslog 드레인은 Heroku 로그를 외부 Syslog 서버로 전달하여 장기 아카이브를 가능하게 합니다. Heroku는 보안(TLS) 및 비보안 Syslog 드레인을 모두 지원합니다. 로그 메시지는 RFC5424에 따라 형식화되며, TCP를 통해 전달됩니다.
- Heroku는 Syslog 시설로 local0, local3, local7을 사용합니다. 이는 언제든지 변경될 수 있습니다.
HTTPS Drains
HTTPS 드레인은 로그 메시지를 HTTPS를 통해 전송합니다. 이를 통해 사용자가 직접 로그 처리 로직을 작성하고 웹 서비스(예: 다른 Heroku 애플리케이션)에서 실행할 수 있습니다. Logplex는 로그 메시지를 배치로 모아 HTTPS 엔드포인트에 POST 요청으로 제출합니다. POST 본문에는 Syslog 형식의 메시지가 포함됩니다.
- Security Considerations : HTTPS 드레인은 HTTPS 프로토콜을 사용한 전송 수준 암호화와 HTTP 기본 인증을 지원합니다. Logplex는 모든 TLS 및 HTTP 연결에서 서버 인증서를 검증합니다. 또한, TLS Syslog 드레인은 최신 TLS(예: TLS 1.2 및 TLS 1.3)를 완전히 지원합니다.
- Syslog 드레인은 인증을 지원하지 않으므로, 주소를 아는 제3자가 로그 메시지를 서버로 보낼 수 있습니다. 보안 조치로, 알 수 없는(또는 누락된) 드레인 토큰이 있는 메시지를 필터링할 수 있습니다.
Debugging Drains
- TLS를 사용하는 Syslog 드레인의 경우, 인증서 또는 호스트 이름 검증 과정이 실패하면 드레인이 로그 수신을 중단할 수 있습니다. 이러한 오류는 다양한 이유로 발생할 수 있으며, 이를 해결하기 위해 heroku logs 명령어를 사용해 로그를 스트리밍하면서 문제를 추적할 수 있습니다. 문제가 있는 드레인을 제거하고 다시 추가하여 문제를 추적할 수도 있습니다.
- TLS Syslog 드레인을 비보안 모드로 전환할 수도 있습니다. 이는 TLS 핸드셰이크 동안 모든 검증 체크를 비활성화합니다.
Removing Drains
- 로그 드레인은 heroku drains:remove 명령어를 사용하여 애플리케이션에서 제거할 수 있습니다. 애드온에 의해 생성된 로그 드레인은 수동으로 제거할 수 없으며, 애드온을 분리하거나 삭제하면 제거됩니다.
Private Space Logging
Private Space Logging은 Shield Private Spaces에서만 사용할 수 있는 기능입니다. 이 기능을 사용하면 애플리케이션 수준이 아닌 공간 수준에서 로그(Heroku log) 캡처를 구성할 수 있습니다. Private Space Logging이 활성화되면 해당 공간의 모든 애플리케이션, Heroku Postgres 데이터베이스, Heroku 시스템 서비스에서 생성된 Heroku log 이벤트가 단일 로그 캡처 대상으로 전달됩니다. Heroku API 로그도 동일한 대상으로 전송됩니다.
- 개발자가 로그 구성을 처리할 필요가 없습니다.
- 공간의 모든 애플리케이션에 대해 일관된 로그 구성을 보장할 수 있습니다. 하나의 애플리케이션이 로그를 캡처하지 않거나 로그를 별도의 대상으로 보내는 것을 방지합니다.
- 감사자가 공간의 로그 구성이 올바르게 설정되었는지 쉽게 확인할 수 있으며, 개발자가 애플리케이션을 추가하거나 제거하더라도 로그 구성은 올바르게 유지됩니다.
Enable Private Space Logging
- Private Space Logging은 공간을 생성할 때 활성화됩니다. 공간 생성 시 Log Drain URL을 지정하여 활성화할 수 있습니다. 한 번 생성된 공간에 대해서는 Private Space Logging을 나중에 활성화할 수 없습니다. 다만, 공간 생성 시 Private Space Logging이 활성화된 경우 나중에 Log Drain URL을 변경할 수 있습니다.
Check Logging Configuration
- 현재 공간의 로그 구성을 확인하려면 drains:get 명령어를 사용할 수 있습니다. Private Space Logging이 구성되지 않은 공간에서는 경고 메시지가 반환됩니다.
Change Space Logging Configuration
- 공간의 로그 대상을 변경하려면 drains:set 명령어를 사용할 수 있습니다. 이 작업을 수행하려면 Heroku 계정에 대한 관리자 권한이 필요합니다.
Logging Format
- 로그는 HTTPS POST 요청으로 전송됩니다. 각 요청 본문에는 최대 500개의 로그 라인이 포함될 수 있습니다. 요청은 로그 배치가 500 로그 라인에 도달하거나 250ms가 경과할 때마다 전송됩니다. 단일 로그 라인의 최대 길이는 10KB이며, 더 긴 라인은 여러 줄로 나누어집니다.
- 요청 본문은 RFC6587에 기반한 syslog 형식의 메시지 시리즈입니다. 각 메시지는 길이를 나타내는 숫자와 공백으로 시작하며, 나머지 메시지는 RFC5424에 따라 형식화됩니다.
Find Log Messages from a Specific Heroku App
- Private Space Logging을 통해 애플리케이션, 런타임 제어 평면 및 Heroku 라우터에서 전송된 로그 메시지는 각 메시지의 첫 번째 요소로 Heroku 앱 UUID를 가집니다. 이를 통해 특정 Heroku 앱의 로그 메시지를 찾을 수 있습니다.
Data Residency
- Private Space Logging이 활성화되면 로그 데이터는 Logplex를 거치지 않고 직접 구성된 로그 대상으로 전송됩니다.
프랑크푸르트에 위치한 Private Space의 로그 데이터는 프랑크푸르트의 로그 대상으로 직접 전송됩니다.
- 일부 Heroku 서비스는 Private Space와 동일한 위치에 있지 않습니다.
예) Heroku API 및 Heroku Build는 글로벌 서비스로 지역을 특정할 수 없어 해당 서비스는 로그 데이터를 직접 로그 대상으로 전송합니다. 동일 위치에 있는 경우만 보호 규정 등이 적용됩니다.
Capture Logs
- HTTPS 기반 로깅 형식을 지원하는 모든 로깅 서비스로 로그를 전달할 수 있습니다. 로그 드레인 대상은 공용으로 확인 가능하고 접근 가능한 URL이어야 합니다. Heroku Private Space 외부의 구성 요소(예: Heroku Data 및 Heroku API)도 로그를 드레인 대상으로 전송할 수 있어야 합니다.
Limitations with Private Space Logging
- Private Space Logging을 사용하면 Logplex의 기능을 사용할 수 없습니다.
로그를 여러 로그 드레인으로 전달하거나 CLI에서 로그를 볼 수 없습니다.
Private Space Logging은 비공개 연결을 통해 접근 가능한 드레인에 로그를 전송할 수 없습니다.
온프레미스 로깅 시스템이 Private Space와의 VPN 연결을 통해 접근 가능하더라도
Private Space Logging은 이를 사용할 수 없습니다.
Private Space Logging을 사용할 때 고려사항 정리
- 다중 로그 드레인 불가: 로그를 여러 로그 드레인으로 전달할 수 없습니다.
- CLI 및 대시보드에서 로그 보기 불가: heroku logs 명령어 또는 대시보드 로그 뷰어에서 로그를 볼 수 없습니다.
- 비공개 연결 제한: Private Space Logging은 비공개 연결을 통해 접근 가능한 드레인에 로그를 전송할 수 없습니다. 공용 인터넷을 통해 접근 가능한 URL이어야 합니다.
- 공용 인터넷 접근 필요: 온프레미스 로깅 시스템은 공용 인터넷을 통해 접근 가능해야 합니다. VPN을 통한 비공개 연결은 지원되지 않습니다.
참조
https://devcenter.heroku.com/articles/logging
https://devcenter.heroku.com/articles/logplex
https://devcenter.heroku.com/articles/log-drains
https://devcenter.heroku.com/articles/private-space-logging
이전글
https://foryounme.co.kr/heroku%ea%b0%9c%eb%85%90%ec%a0%95%eb%a6%ac-4-%ed%97%a4%eb%a1%9c%ec%bf%a0%ec%9d%98-%ec%9e%91%eb%8f%99-%eb%b0%a9%ec%8b%9d-how-heroku-works/