로그를 검토하여 파이프라인 문제 진단
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
파이프라인 로그는 파이프라인 오류의 원인을 결정하는 강력한 도구를 제공하며 자세한 진단 정보를 제공하도록 자세한 로그를 구성할 수 있습니다.
일반적인 시작점은 완료된 빌드 또는 릴리스의 로그를 검토하는 것입니다. 파이프라인 실행 요약으로 이동하고 작업을 선택하여 로그를 볼 수 있습니다. 특정 작업이 실패하는 경우 해당 작업에 대한 로그를 확인합니다. 자세한 진단 정보를 포함하도록 자세한 정보 표시 로그를 구성합니다 .
자세한 정보 표시 로그 구성
문제 해결을 지원하기 위해 로그를 보다 상세하게 구성할 수 있습니다.
단일 실행에 대한 자세한 정보 표시 로그를 구성하려면 실행 파이프라인을 선택하고 시스템 진단 사용, 실행을 선택하여 새 빌드를 시작할 수 있습니다.
모든 실행에 대해 자세한 정보 표시 로그를 구성하려면 이름이 지정된
system.debug
변수를 추가하고 해당 값을true
.로 설정할 수 있습니다.
단일 실행에 대한 자세한 정보 표시 로그를 구성하려면 큐 빌드를 선택하고 변수
true
값을 로 설정하여 새 빌드를system.debug
시작할 수 있습니다.모든 실행에 대해 자세한 정보 표시 로그를 구성하려면 빌드를 편집하고, 변수 탭으로 이동한 다음, 변수를
system.debug
추가하고, 해당 값을 <a0/>로 설정하고, 큐 시간에 허용하도록 선택합니다. YAML 파이프라인에 대한 자세한 정보 표시 로그를 구성하려면 섹션에
system.debug
변수를variables
추가합니다.variables: system.debug: true
이제 Azure 파이프라인 로그는 메모리, CPU 사용량 및 사용 가능한 디스크 공간과 같은 리소스 사용률 메트릭을 캡처할 수 있습니다. 로그에는 파이프라인 에이전트에서 사용하는 리소스와 작업에서 실행되는 작업을 포함한 자식 프로세스도 포함됩니다. 파이프라인 작업이 리소스 제약 조건이 발생할 수 있다고 의심되는 경우 자세한 정보 표시 로그를 사용하여 파이프라인 로그에 리소스 사용률 정보를 삽입할 수 있습니다. 리소스 사용률 메트릭은 호스팅 모델과는 별개로 모든 에이전트에서 사용할 수 있습니다.
캡처된 리소스 사용률 메트릭을 보려면 로그에서 각 단계에 대한 Agent environment resources
항목을 검색합니다.
2024-02-28T17:41:15.1315148Z ##[debug]Agent environment resources - Disk: D:\ Available 12342.00 MB out of 14333.00 MB, Memory: Used 1907.00 MB out of 7167.00 MB, CPU: Usage 17.23%
로그 보기 및 다운로드
각 단계에 대한 개별 로그를 보려면 실행에 대한 빌드 결과로 이동하고 작업 및 단계를 선택합니다.
모든 로그를 다운로드하려면 실행에 대한 빌드 결과로 이동하여 ...를 선택하고 로그 다운로드를 선택합니다.
모든 로그를 다운로드하려면 실행에 대한 빌드 결과로 이동하고 모든 로그를 zip으로 다운로드를 선택합니다.
파이프라인 진단 로그 외에도 다음과 같은 특수 로그 유형을 사용할 수 있으며 문제를 해결하는 데 도움이 되는 정보가 포함될 수 있습니다.
작업자 진단 로그
빌드 에이전트의 작업자 프로세스에서 생성된 완료된 빌드의 진단 로그를 가져올 수 있습니다. 완료된 빌드의 worker
날짜 및 타임스탬프를 포함하는 로그 파일을 찾습니다. 예들 들어 worker_20160623-192022-utc_6172.log
입니다.
에이전트 진단 로그
에이전트 진단 로그는 에이전트가 구성된 방법과 에이전트가 실행되었을 때 발생한 일에 대한 레코드를 제공합니다. agent
로그 파일을 찾습니다. 예들 들어 agent_20160624-144630-utc.log
입니다. 에이전트 로그 파일의 종류는 두 가지입니다.
실행할 때 생성된 로그 파일입니다
config.cmd
. 이 로그:위쪽에 다음 줄을 포함합니다.
Adding Command: configure
선택한 구성을 표시합니다.
실행할 때 생성된 로그 파일입니다
run.cmd
. 이 로그:프로세스가 종료될 때까지 열 수 없습니다.
Azure DevOps 조직 또는 Team Foundation Server에 연결하려고 시도합니다.
각 작업이 실행된 시기 및 완료 방법을 표시합니다.
두 로그 모두 에이전트 기능이 검색되고 설정된 방법을 보여 줍니다.
자체 호스팅 에이전트에 대한 네트워크 진단
Agent.Diagnostic
값을 true
로 설정하여 자체 호스팅 에이전트에 대한 네트워크 문제를 해결하는 데 사용할 수 있는 추가 로그를 수집합니다.
파일 | 정보 | 적용 대상 |
---|---|---|
cloudinit.* |
Cloud-init가 성공적으로 완료되었습니다(사용되는 경우). | Linux |
BrokenPackages.* |
패키지가 일관된 상태입니다. | Linux |
Agent.* |
환경 변수 | Linux, Windows |
waagentConf.txt |
Azure VM 에이전트(waagent.conf) | Azure: Linux, Windows |
environment.txt / agent.* |
계정 그룹 멤버 자격 목록 | Windows |
참고 항목
System.Debug
가 true
로 설정된 경우 Agent.Diagnostic
은 자동으로 true
로 설정됩니다.
이 섹션에 설명된 변수 및 로그는 Agent.Diagnostic
에이전트 v2.200.0 이상에서 사용할 수 있습니다.
자세한 내용은 microsoft/azure-pipelines-agent Azure Pipelines 에이전트 오픈 소스 에이전트 리포지토리의 에이전트 문제 해결 을 참조하세요.
기타 로그
진단 로그 내에서 찾을 environment.txt
수 있습니다.capabilities.txt
파일에는 environment.txt
빌드가 실행된 환경에 대한 다양한 정보가 있습니다. 여기에는 실행 중인 작업, 방화벽 사용 여부, PowerShell 버전 정보 및 기타 항목과 같은 정보가 포함됩니다. 이 데이터를 지속적으로 추가하여 더 유용하게 만듭니다.
이 파일은 capabilities.txt
빌드를 실행한 빌드 머신에 설치된 모든 기능을 볼 수 있는 클린 방법을 제공합니다.
HTTP 추적 로그
Important
HTTP 추적 및 추적 파일에는 암호 및 기타 비밀이 포함될 수 있습니다. 공용 사이트에 게시하지 마세요.
기본 제공 HTTP 추적 사용
에이전트가 버전 2.114.0 이상인 경우 HTTP 트래픽 헤더를 추적하고 진단 로그에 쓸 수 있습니다. agent.listener를 VSTS_AGENT_HTTPTRACE
시작하기 전에 환경 변수를 설정합니다.
Windows:
set VSTS_AGENT_HTTPTRACE=true
macOS/Linux:
export VSTS_AGENT_HTTPTRACE=true
전체 HTTP 추적 사용 - Windows
Fiddler를 시작 합니다.
에이전트 트래픽만 수신 대기하는 것이 좋습니다. 파일 > 캡처 트래픽 끄기(F12)
HTTPS 트래픽 암호 해독을 사용하도록 설정합니다. 도구 > Fiddler 옵션 > HTTPS 탭. HTTPS 트래픽 암호 해독
에이전트에 프록시를 사용하도록 알릴 수 있습니다.
set VSTS_HTTP_PROXY=http://127.0.0.1:8888
에이전트를 대화형으로 실행합니다. 서비스로 실행하는 경우 서비스가 실행 중인 계정에 대한 제어판에서 환경 변수로 설정할 수 있습니다.
에이전트를 다시 시작합니다.
전체 HTTP 추적 사용 - macOS 및 Linux
Charles 프록시(Windows의 Fiddler와 유사)를 사용하여 에이전트의 HTTP 추적을 캡처합니다.
Charles 프록시를 시작합니다.
Charles: 프록시 > 프록시 설정 > SSL 탭. 사용. URL을 추가합니다.
Charles: 프록시 > Mac OSX 프록시. 에이전트 트래픽만 보려면 사용하지 않도록 설정하는 것이 좋습니다.
export VSTS_HTTP_PROXY=http://127.0.0.1:8888
에이전트를 대화형으로 실행합니다. 서비스로 실행되는 경우 .env 파일에서 설정할 수 있습니다. nix service를 참조하세요.
에이전트를 다시 시작합니다.
사용자 지정 로그 캡처
기본 제공 로그 외에도 작업 및 스크립트를 사용하여 파이프라인에서 사용자 지정 로그를 캡처할 수 있습니다. 다음 예제에서는 리소스 사용률, 네트워크 추적, 메모리 덤프 및 perfview 추적을 캡처하는 방법을 보여 줍니다. 고객 지원으로 작업하는 경우 이와 같은 로그를 캡처하라는 메시지가 표시될 수 있습니다.
- 리소스 사용률 세부 정보 캡처
- ProcDump를 사용하여 dotnet 프로세스 메모리 덤프 캡처
- 호스트된 에이전트에 대한 ETW 추적 캡처
- Capture perfview traces for Visual Studio build
사용자 지정 로그 검색
파이프라인에서 사용자 지정 로그를 캡처한 후 검토를 위해 검색할 수 있도록 업로드해야 합니다. 표준 파이프라인 로그의 일부로 사용자 지정 로그를 업로드하거나 아티팩트로 업로드할 수 있습니다. 다음 섹션의 예제에서는 사용자 지정 로그를 업로드하는 두 가지 방법을 보여 줍니다.
표준 로그의 일부로 로그 업로드
표준 파이프라인 로그의 일부로 사용자 지정 로그를 업로드하려면 원하는 파일을 업로드하는 데 사용합니다 ##vso[task.uploadfile]
. 이 명령을 사용하려면 다음 예제와 같이 스크립트 명령의 일부로 지정합니다. 파일을 다운로드하여 표준 파이프라인 로그의 일부로 볼 수 있습니다. 이 ##vso[task.uploadfile]
메서드는 단일 로그 파일을 업로드하는 데 적합합니다. 로그 파일이 두 개 이상 있는 경우 각 파일에 대해 별도의 ##vso[task.uploadfile]
줄을 사용해야 합니다.
- pwsh: Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\resource-usage.txt"
자세한 내용은 로깅 명령 및 UploadFile: 작업 로그와 함께 다운로드할 수 있는 파일 업로드를 참조하세요.
로그를 파이프라인 아티팩트로 업로드
사용자 지정 로그를 파이프라인 아티팩트로 업로드하려면 PublishPipelineArtifact@1 작업을 사용합니다. PublishPipelineArtifact@1
는 디렉터리 경로에 있는 단일 파일 또는 파일을 업로드할 수 있으며 업로드할 사용자 지정 로그 파일이 많은 경우에 유용합니다.
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)/s/trace'
artifact: 'file_result.pcap'
publishLocation: 'pipeline'
자세한 내용은 파이프라인 아티팩트 게시를 참조 하세요.
리소스 사용률 세부 정보 캡처
Azure DevOps Services를 사용하는 경우 자세한 로그를 사용하도록 설정 하여 디스크 사용량, 메모리 사용량 및 CPU 사용률을 포함하여 로그에서 리소스 사용률을 확인할 수 있습니다. 파이프라인이 완료되면 로그에서 각 단계에 대한 Agent environment resources
항목을 검색합니다.
2024-02-28T17:41:15.1315148Z ##[debug]Agent environment resources - Disk: D:\ Available 12342.00 MB out of 14333.00 MB, Memory: Used 1907.00 MB out of 7167.00 MB, CPU: Usage 17.23%
Azure DevOps Server를 사용하거나 추가 메트릭을 수집하려는 경우 PowerShell을 사용하여 리소스 사용률을 캡처하고 파이프라인 로그에 업로드할 수 있습니다. 파이프라인 실행이 완료되면 파이프라인 로그를 다운로드하고 캡처된 데이터를 볼 수 있습니다. 단계가 Upload resource usage from pipeline run
작업의 여섯 번째 단계인 경우 로그의 파일 이름은 6_resource-usage.txt.
# Place this task in your pipeline to log the current resource utilization
# of the pipeline. This task appends the specified resource usage to a logfile
# which is uploaded at the end of the current pipeline job.
- pwsh: |
$logFile = '$(Agent.TempDirectory)\resource-usage.txt'
if (!(Test-Path $logFile))
{
New-Item $logFile
}
Get-Date | Out-File -FilePath $logFile -Append
Get-Volume | Out-File -FilePath $logFile -Append
Get-Counter '\Memory\Available MBytes' | Out-File -FilePath $logFile -Append
Get-Counter '\Processor(_Total)\% Processor Time' | Out-File -FilePath $logFile -Append
sleep 10
displayName: 'Check resource utilization'
# Other tasks here, and you can repeat the "Check resource utilization"
# step if desired, and the results will be appended to the resource-usage.txt file
- pwsh: Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\resource-usage.txt"
displayName: 'Upload resource usage from pipeline run'
condition: always()
ProcDump를 사용하여 dotnet 프로세스 메모리 덤프 캡처
충돌하는 테스트 실행이 있는 경우 고객 지원에서 테스트 실행 실패 후 dotnet 프로세스의 메모리 덤프를 캡처하도록 요청할 수 있습니다. Visual Studio 테스트 작업 다음에 다음 작업을 추가 condition: always()
합니다. 파이프라인 실행이 완료되면 메모리 덤프를 포함하여 파이프라인 로그를 다운로드할 수 있습니다.
# Run this task after your test execution crashes
# with a condition of alway() so that it always runs
- pwsh: |
Invoke-WebRequest https://download.sysinternals.com/files/Procdump.zip -OutFile $(Agent.TempDirectory)\Procdump.zip
mkdir $(Agent.TempDirectory)\Procdump
unzip $(Agent.TempDirectory)\Procdump.zip -d Procdump
cd $(Agent.TempDirectory)\Procdump
Get-Process dotnet | % { $(Agent.TempDirectory)\procdump.exe -accepteula -ma $_.Id dotnet-$($_.Id).dmp }
Compress-Archive *.dmp -DestinationPath $(Agent.TempDirectory)\dump_files.zip
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\dump_files.zip"
condition: always()
displayName: 'Create and upload a dotnet process memory dump'
호스트된 에이전트에 대한 ETW 추적 캡처
Microsoft 호스팅 에이전트의 네트워크 문제를 해결하는 경우 고객 지원에서 ETW 추적을 수집하도록 요청할 수 있습니다. 파이프라인 실행이 완료되면 ETW 추적을 포함하여 파이프라인 로그를 다운로드할 수 있습니다.
# Add this task to start the ETW trace
- script: netsh trace start scenario=InternetClient capture=yes tracefile=$(Agent.TempDirectory)\networktrace.etl
displayName: 'Start ETW trace'
# Other tasks here
# Add these 2 tasks to stop the trace and upload
# the trace to the pipeline logs
- script: netsh trace stop
displayName: 'Stop ETW trace'
- pwsh: |
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\networktrace.etl"
Write-Host "##vso[task.uploadfile]$(Agent.TempDirectory)\networktrace.cab"
displayName: 'Upload ETW trace logs'
Visual Studio 빌드에 대한 추적 캡처 perfview
고객 지원에서 Visual Studio 빌드의 추적을 perfview 만들도록 요청하는 경우 Visual Studio 빌드 단계 전후에 파이프라인에 다음 작업을 추가합니다.
파이프라인을 실행한 후 파이프라인 실행 세부 정보에서 PerfViewLog 아티팩트 다운로드하고 해당 파일 고객 지원을 보낼 수 있습니다.
steps:
- task: PowerShell@2 # download the perfview exe
inputs:
targetType: 'inline'
script: |
invoke-webrequest https://github.com/microsoft/perfview/releases/download/v3.1.7/PerfView.exe -OutFile PerfView.exe
- task: PowerShell@2
inputs:
targetType: 'inline' # start perfview to capture the traces before build build task
script: '$(System.DefaultWorkingDirectory)\PerfView.exe "/DataFile:PerfViewData.etl" /accepteula /BufferSizeMB:512 /StackCompression /CircularMB:5000 /Providers:"Microsoft-Windows-IIS" /logfile:"PerfView.log" /zip:true /norundown start'
- task: VSBuild@1
displayName: '$(solution)' # build of the solution, note the msbuildargs might be different for your scenario
inputs:
solution: '$(solution)'
clean: true
msbuildArgs: '/p:DeployOnBuild=true /p:PrecompileBeforePublish=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)" /p:TransformWebConfigEnabled=false /p:AutoParameterizationWebConfigConnectionStrings=false /p:MarkWebConfigAssistFilesAsExclude=false /p:ProfileTransformWebConfigEnabled=false /p:IsTransformWebConfigDisabled=true'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PowerShell@2 # stop the perfview tracing
inputs:
targetType: 'inline'
script: |
$(System.DefaultWorkingDirectory)\perfview.exe /accepteula /logfile:"PerfView.log" stop
- task: PowerShell@2 # abort perfview, it seems required.
inputs:
targetType: 'inline'
script: '$(System.DefaultWorkingDirectory)\perfview.exe /accepteula /logfile:"PerfView.log" abort'
- task: PowerShell@2 # add a sleep of 5 mins, to give it time for required traces to be complete
inputs:
targetType: 'inline'
script: 'Start-Sleep -Seconds 300'
- task: PublishPipelineArtifact@1 # upload the traces
displayName: 'Publish Pipeline Artifact'
inputs:
artifactName: webapp