로그를 검토하여 파이프라인 문제 진단

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.Debugtrue로 설정된 경우 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

  1. Fiddler를 시작 합니다.

  2. 에이전트 트래픽만 수신 대기하는 것이 좋습니다. 파일 > 캡처 트래픽 끄기(F12)

  3. HTTPS 트래픽 암호 해독을 사용하도록 설정합니다. 도구 > Fiddler 옵션 > HTTPS 탭. HTTPS 트래픽 암호 해독

  4. 에이전트에 프록시를 사용하도록 알릴 수 있습니다.

    set VSTS_HTTP_PROXY=http://127.0.0.1:8888
    
  5. 에이전트를 대화형으로 실행합니다. 서비스로 실행하는 경우 서비스가 실행 중인 계정에 대한 제어판에서 환경 변수로 설정할 수 있습니다.

  6. 에이전트를 다시 시작합니다.

전체 HTTP 추적 사용 - macOS 및 Linux

Charles 프록시(Windows의 Fiddler와 유사)를 사용하여 에이전트의 HTTP 추적을 캡처합니다.

  1. Charles 프록시를 시작합니다.

  2. Charles: 프록시 > 프록시 설정 > SSL 탭. 사용. URL을 추가합니다.

  3. Charles: 프록시 > Mac OSX 프록시. 에이전트 트래픽만 보려면 사용하지 않도록 설정하는 것이 좋습니다.

    export VSTS_HTTP_PROXY=http://127.0.0.1:8888
    
  4. 에이전트를 대화형으로 실행합니다. 서비스로 실행되는 경우 .env 파일에서 설정할 수 있습니다. nix service를 참조하세요.

  5. 에이전트를 다시 시작합니다.

사용자 지정 로그 캡처

기본 제공 로그 외에도 작업 및 스크립트를 사용하여 파이프라인에서 사용자 지정 로그를 캡처할 수 있습니다. 다음 예제에서는 리소스 사용률, 네트워크 추적, 메모리 덤프 및 perfview 추적을 캡처하는 방법을 보여 줍니다. 고객 지원으로 작업하는 경우 이와 같은 로그를 캡처하라는 메시지가 표시될 수 있습니다.

사용자 지정 로그 검색

파이프라인에서 사용자 지정 로그를 캡처한 후 검토를 위해 검색할 수 있도록 업로드해야 합니다. 표준 파이프라인 로그의 일부로 사용자 지정 로그를 업로드하거나 아티팩트로 업로드할 수 있습니다. 다음 섹션의 예제에서는 사용자 지정 로그를 업로드하는 두 가지 방법을 보여 줍니다.

표준 로그의 일부로 로그 업로드

표준 파이프라인 로그의 일부로 사용자 지정 로그를 업로드하려면 원하는 파일을 업로드하는 데 사용합니다 ##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 givet time for required for 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