문제 해결을 위해 작업 로그 접근하기
문제 해결을 위해 작업 로그 접근하기 (Access job logs for troubleshooting)
애플리케이션 로그를 보는 것은 문제 디버깅, 성능 문제 조사, 또는 애플리케이션이 올바르게 시작되었는지 확인하는 데 매우 중요해요. Nomad는 이를 최대한 간단하게 하기 위해 다음을 제공해요:
이 섹션은 "docs"라는 작업을 사용하지만, 이러한 작업과 명령은 Nomad의 모든 작업에 대체로 적용돼요.
출처: 문서
본문
이전 예제의 run 명령 출력을 상기하면 다음과 같아요:
$ nomad job run docs.nomad.hcl
==> Monitoring evaluation "42d788a3"
Evaluation triggered by job "docs"
Allocation "04d9627d" created: node "a1f934c9", group "example"
Allocation "e7b8d4f5" created: node "012ea79b", group "example"
Allocation "5cbf23a1" modified: node "1e1aa1e0", group "example"
Evaluation status changed: "pending" -> "complete"
==> Evaluation "42d788a3" finished with status "complete"
제공된 할당 ID(nomad status 명령으로도 확인 가능)는 애플리케이션의 로그에 접근하는 데 필요해요. 애플리케이션의 로그에 접근하려면 다음 명령을 실행해요:
$ nomad alloc logs 04d9627d
출력은 다음과 비슷할 거예요:
<timestamp> 10.1.1.196:5678 10.1.1.196:33407 "GET / HTTP/1.1" 200 12 "curl/7.35.0" 21.809µs
<timestamp> 10.1.1.196:5678 10.1.1.196:33408 "GET / HTTP/1.1" 200 12 "curl/7.35.0" 20.241µs
<timestamp> 10.1.1.196:5678 10.1.1.196:33409 "GET / HTTP/1.1" 200 12 "curl/7.35.0" 13.629µs
기본적으로 이 명령은 태스크의 로그를 반환해요. 작업 파일에 둘 이상의 태스크가 정의되어 있다면 태스크 이름이 필수 인수예요:
$ nomad alloc logs 04d9627d server
logs 명령은 로그 표시와 함께 tail -f처럼 더 많은 출력을 차단하며 로그를 따라가기(follow)를 지원해요. 로그를 따라가려면 적절한 이름의 -f 플래그를 사용해요:
$ nomad alloc logs -f 04d9627d
이렇게 하면 로그가 콘솔로 스트리밍돼요.
로그의 "꼬리(tail)"만 관심 있다면 -tail과 -n 플래그를 사용해요:
$ nomad alloc logs -tail -n 25 04d9627d
이것은 마지막 25줄을 보여줘요. -n 플래그를 생략하면 -tail은 기본적으로 10줄로 설정돼요.
기본적으로 stdout의 로그만 표시돼요. stderr의 로그 출력을 보려면 -stderr 플래그를 사용해요:
$ nomad alloc logs -stderr 04d9627d
"로그 쉬퍼" 패턴 고려하기 (Consider the "log shipper" pattern)
logs 명령은 애플리케이션 로그에 빠르게 접근하는 데는 잘 작동하지만, 일반적으로 대규모 시스템이나 많은 로그 출력을 생성하는 시스템, 특히 로그의 장기 저장에는 확장되지 않아요. Nomad의 로그 파일 보존은 최선 노력(best effort)이므로, 말이 많은(chatty) 애플리케이션은 더 나은 로그 보존 전략을 사용해야 해요.
애플리케이션은 alloc/ 디렉토리에 로그를 남기므로, 같은 태스크 그룹의 모든 태스크는 서로의 로그에 접근할 수 있어요. 따라서 다음과 같은 태스크 그룹을 가질 수 있어요:
group "my-group" {
task "server" {
# ...
# Setting the server task as the leader of the task group allows Nomad to
# signal the log shipper task to gracefully shutdown when the server exits.
leader = true
}
task "log-shipper" {
# ...
}
}
위 예제에서 server 태스크는 실행되어야 할 애플리케이션이며 로그를 생성해요. log-shipper는 alloc/logs/ 디렉토리에서 해당 로그를 읽어 Amazon S3 같은 장기 저장 솔루션이나 내부 로그 집계 시스템으로 보내요.
로그 쉬퍼 패턴을 사용할 때, 특히 배치(batch) 작업의 경우 메인 태스크를 리더 태스크로 표시해야 해요. 메인 태스크를 리더로 표시하면, 태스크가 완료될 때 그룹의 모든 다른 태스크가 정상적으로 종료돼요. 이로 인해 로그 쉬퍼가 남은 로그를 보내고 나서 자신도 종료할 수 있어요. 로그 쉬퍼는 종료하기 전에 남은 로그를 보낼 수 있도록 충분히 높은 kill_timeout을 설정해야 해요.