AWS에서 프로덕션을 실행하는 경우 가장 먼저 CloudWatch
을 활용해야합니다. 같은 위치를 정확히 erl_crash.dump
에 대한 환경 변수를 구성하여 Dockerfile 내부
config :logger,
handle_otp_reports: true,
handle_sasl_reports: true,
metadata: [:application, :module, :function, :file, :line]
config :logger,
backends: [
{LoggerFileBackend, :shared_error}
]
config :logger, :shared_error,
path: "#{logging_dir}/verbose-error.log",
level: :error
를 기록됩니다 : ERL_CRASH_DUMP=/opt/log/erl_crash.dump
는 그 다음 .config
내부 awslogs
를 구성하여 elixir
코드에서 이 같은 로거를 구성 .ebextensions
아래 파일 :
files:
"/etc/awslogs/config/stdout.conf":
mode: "000755"
owner: root
group: root
content: |
[erl_crash.dump]
log_group_name=/aws/elasticbeanstalk/your_app/erl_crash.dump
log_stream_name={instance_id}
file=/var/log/erl_crash.dump
[verbose-error.log]
log_group_name=/aws/elasticbeanstalk/your_app/verbose-error.log
log_stream_name={instance_id}
file=/var/log/verbose-error.log
u는 그 후, 당신은 CloudWatch
아래 오류 메시지를 검사 할 수 있습니다 Dockerrun.aws.json
"Logging": "/var/log",
"Volumes": [
{
"HostDirectory": "/var/log",
"ContainerDirectory": "/opt/log"
}
],
아래에 고정 표시기에 볼륨을 설정합니다. AWS ECS
반대로 당신이 Docker
배포 (내 예를 들어 위의 암시 적 의미하는) ElasticBeanstalk
를 사용하는 경우 는 지금, 다음 std_input
의 로그는 CloudWatch
내부 /var/log/eb-docker/containers/eb-current-app/stdouterr.log
기본적으로 리디렉션됩니다.
erl_crash.dump
의 주요 목적은 응용 프로그램이되어 컨테이너를 복용, 추락 할 때 적어도 알고있다.AWS EB
은 일반적으로 컨테이너를 다시 시작하므로 다시 시작하는 것에 대해 무지하게 유지됩니다. 이러한 이해는 다른 도커 관련 로그에서도 얻을 수 있으며, 알람을 수신 대기하도록 구성하여 도커를 다시 시작해야 할 때 알릴 수 있습니다. 그러나 CloudWatch를에 erl_crash.dump
로깅의 또 다른 장점은 필요하다면, 당신은 항상, S3 나중에 내보낼 파일을 다운로드하고 무엇이 잘못되었는지 분석을 할 :observer
내부 가져올 수 있다는 것입니다. 로그를 컨설팅 한 후, 당신은 여전히 당신의 생산 응용 프로그램과 더 친밀한 상호 작용이 필요한 경우
는, 당신은 당신의 노드에 remsh
을 활용해야합니다.
rel/confix.exs
내부 설정 쿠키 :
environment :prod do
set include_erts: false
set include_src: false
set cookie: :"my_cookie"
end
및 rel/templates/vm.args.eex
에서 사용자가 설정 한 변수 :
당신이
distillery
를 사용하는 경우
cookie
이처럼 릴리스 생산 응용 프로그램의
node name
을 구성합니다
-name <%= node_name %>
-setcookie <%= release.profile.cookie %>
및 rel/config.exs
의 경우 다음과 같이 설정합니다.
당신이 할 수있는,
CONTAINER_ID=$(sudo docker ps --format '{{.ID}}')
sudo docker exec -it $CONTAINER_ID bash -c "iex --name [email protected] --cookie my_cookie"
을 한 번 내부 :
release :my_app do
set version: "0.1.0"
set overlays: [
{:template, "rel/templates/vm.args.eex", "releases/<%= release_version %>/vm.args"}
]
set overlay_vars: [
node_name: "[email protected]",
]
10 그럼 당신은 바로 다음 첫 번째 SSH 오링 고정 표시기 컨테이너를 수용하는 EC2 인스턴스 내부에 의해 고정 표시기 내에서 실행 생산 노드에 연결하고 실행할 수 있습니다 그런 다음 주위를 두드 리거나 if need be
, 자신의 위험에 따라 검사하려는 모듈의 수정 된 코드를 동적으로 주입하십시오. 쉬운 방법은 컨테이너 내부에 파일을 작성하여 호출하는 것입니다. Node.spawn_link target_node, fn Code.eval_file(file_name, path) end
프로덕션 노드가 이미 실행 중이며 쿠키를 모르는 경우 실행중인 컨테이너에 들어가서 다음을 수행 할 수 있습니다. ps aux > t.log
및 임의의 쿠키를 적용하고 그에 따라 사용 된 내용을 파악하기 위해 cat t.log
을한다.
고정 표시기 epmd
는 다른 노드와 통신 할 수있는 방법에 걸림돌로 작용한다. 가장 좋은 그러므로 오히려 Packer
를 사용하여 자신의 AWS AMI
이미지를 만드는 대신 베어 메탈 배포를 수행하는 것입니다.
아마존은 최근 AWS ECS
, AWS VPC Networking Mode에 새로운 기능을 출시했습니다. 이것은 아마도 컨테이너 간 상호 통신을 용이하게하여 노드에 직접 연결될 수 있습니다. 나는 그것을 아직 시도하지 않았다, 나는 틀릴지도 모른다.
AWS 이외의 제공 업체에서 실행중인 경우 SSM agent
또는 다른 서비스로 원격 로그에 쉽게 액세스하는 방법을 알아내는 것이 필수입니다. 콘솔 - -
를 사용하여 특정 로그는 항상 로그에 대한 기본 백엔드를 대체 할 수있는 사용자의 요구에 적합한 뭔가. – PatNowak
로그를 디버깅, 재배포 및 감시하려는 모든 곳에서'Logger.error'를 추가하십시오. 나는 또한 더 나은 접근법에 대해 듣고 싶다. –
또한 프로덕션 시스템과 디버그 시스템 간의 정확한 차이를 확인하고이를 제거 할 수 있습니다. 내가 아는 한 BEAM 코드의 관점에서 "디버그"빌드가 존재하지 않으므로 두 환경에서 코드가 동일해야합니다. –