개발자

도커에서 배포될 때 kubectl logs 명령해도 로그가 나타나지 않습니다

2023년 04월 13일조회 349

쿠버네티스에 배포될 때 kubectl logs 명령으로 컨테이너 로그 확인할 수 있는 걸로 알고 있는데 로그가 나타나지 않는 건 어떤 문제일까요...? 아래 샘플 코드 첨부했습니다 ㅠㅠ (로그 수집이 목적은 아니고 디버깅 목적으로 파드 로그 확인하려고 해요)

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

이양일님의 프로필 사진

안녕하세요! 공유주신 코드로 DockerFile 을 어떻게 작성하셨고, 이를 쿠버네티스에 어떤 형태로 배포하셨는지 알 수 없어 정확한 답변은 아닐 수 있습니다만 추측되는 부분을 말씀드려보겠습니다. 쿠버네티스는 pod 에서 실행되는 컨테이너화된 어플리케이션의 stdout(표준출력), stderr(표준 에러) 를 컨테이너 엔진이 처리 및 리디렉션하여 설정된 로그 디렉토리에 관리 및 로테이션이 수행되며, kubectl logs 명령어는 이렇게 관리된 파일을 보여주도록 하는 명령어 입니다. 따라서 보통 가장 크게 실수하는 케이스가 일반 물리장비 혹은 가상 장비에서 운영하듯이 어플리케이션의 stdout, stderr 출력을 자체적으로 리디렉션 하여 파일로 남기거나 다른 처리를 하도록 구성하여 컨테이너 엔진이 처리할 로그를 리디렉션 하지 못해 kubectl logs 명령어로 로그를 볼 수 없는 케이스 입니다. 그 다음으로는 pod 이 어떠한 이슈로 running 상태가 아니거나 이미 종료되었을 경우 혹은 다른 pod 이나 container 를 조회하게 될때 정도일거 같습니다. 저의 짧은 지식이 부디 도움이 되시길 바라겠습니다.

강병진님의 프로필 사진

namespace 문제가 아닐까 추측합니다. logs 명령어를 실행할 때 namespace를 입력해주지 않으면 디폴트 네임스페이스를 보는데, 작성자분이 올리신 pod가 디폴트 네임스페이스가 아니라면 안찍힐 수 있습니다

이양일님의 프로필 사진

이양일

NaverCloud 백엔드 개발자2023년 04월 16일

아 그럴수도 있겠네요! 저도 하나 배워 갑니다 :)

커리어리 AI 봇님의 프로필 사진

로그가 나타나지 않는 이유는 프로그램에서 출력 버퍼를 플러시하지 않아서입니다. Python의 ' print ' 함수는 기본적으로 출력 버퍼를 사용하며, 이 버퍼가 가득 찼을 때만 실제로 출력됩니다. 디버깅을 위한 로그를 출력하려면 버퍼를 수동으로 플러시해야 합니다. #1' print ' 함수에서 ' flush=True ' 옵션을 사용하여 출력 버퍼를 강제로 플러시하면 로그가 즉시 출력됩니다. #2 또한 ' sys.stdout.write '를 사용하는 경우에는 ' sys.stdout.flush() '를 호출하여 출력 버퍼를 플러시해야 합니다. 이렇게 변경한 후 쿠버네티스에서 배포하고 ' kubectl logs ' 명령을 사용하면 로그가 정상적으로 출력되어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#1
import time
import sys

print('[INFO] App started.', flush=True)

while(True):
    time.sleep(5)
    print('[INFO] App still running.', flush=True)

    # 로직 처리

print('[INFO] App terminated.', flush=True)

#2
import time
import sys

sys.stdout.write('[INFO] App started.\n')
sys.stdout.flush()

while(True):
    time.sleep(5)
    sys.stdout.write('[INFO] App still running.\n')
    sys.stdout.flush()

    # 로직 처리

sys.stdout.write('[INFO] App terminated.\n')
sys.stdout.flush()

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!