Estensione AzureLogCollectorAzureLogCollector Extension

Per diagnosticare i problemi con un servizio cloud di Microsoft Azure è necessario raccogliere i file di log del servizio nelle macchine virtuali non appena si verificano i problemi.Diagnosing issues with an Microsoft Azure cloud service requires collecting the service’s log files on virtual machines as the issues occur. È possibile usare l'estensione AzureLogCollector su richiesta per eseguire una raccolta occasionale di log da una o più macchine virtuali del servizio cloud (da ruoli Web e ruoli di lavoro) e trasferire i file raccolti in un account di archiviazione di Azure, senza accedere in modalità remota ad alcuna macchina virtuale.You can use the AzureLogCollector extension on-demand to perfom one-time collection of logs from one or more Cloud Service VMs (from both web roles and worker roles) and transfer the collected files to an Azure storage account – all without remotely logging on to any of the VMs.

Nota

Le descrizioni per la maggior parte delle informazioni registrate sono disponibili all'indirizzo http://blogs.msdn.com/b/kwill/archive/2013/08/09/windows-azure-paas-compute-diagnostics-data.asp.Descriptions for most of the logged information can be found at http://blogs.msdn.com/b/kwill/archive/2013/08/09/windows-azure-paas-compute-diagnostics-data.asp.

Sono disponibili due modalità di raccolta a seconda dei tipi di file da raccogliere.There are two modes of collection dependent on the types of files to be collected.

  • Solo log di agenti guest di Azure (GA).Azure Guest Agent Logs only (GA). Questa modalità di raccolta include tutti i log relativi agli agenti guest di Azure e ad altri componenti di Azure.This collection mode includes all the logs related to Azure guest agents and other Azure components.
  • Tutti i log (Completa).All Logs (Full). Questa modalità di raccolta raccoglierà tutti i file in modalità Agenti guest, oltre a:This collection mode will collect all files in GA mode plus:

    • log eventi di sistema e dell'applicazionesystem and application event logs
    • log degli errori HTTPHTTP error logs
    • log di IISIIS Logs
    • log di installazioneSetup logs
    • altri log di sistemaother system logs

In entrambe le modalità di raccolta, è possibile specificare cartelle di raccolta dati aggiuntive usando una raccolta con la struttura seguente:In both collection modes, additional data collection folders can be specified by using a collection of the following structure:

  • Nome: nome della raccolta, che verrà usato come nome della sottocartella all'interno del file ZIP da raccogliere.Name: The name of the collection, which will be used as the name of subfolder inside the zip file to be collected.
  • Percorso: percorso della cartella nella macchina virtuale in cui verrà raccolto il file.Location: The path to the folder on the virtual machine where file will be collected.
  • Modello di ricerca: modello dei nomi di file da raccogliere.SearchPattern: The pattern of the names of files to be collected. Il valore predefinito è "".Default is “”
  • Ricorsiva: se i file verranno raccolti in modo ricorsivo nella cartella.Recursive: if the files will be collected recursively under the folder.

PrerequisitiPrerequisites

  • Per poter salvare i file ZIP generati dall'estensione è necessario disporre di un account di archiviazione.You need to have a storage account for extension to save generated zip files.
  • È necessario assicurarsi che siano in uso i cmdlet di Azure PowerShell v0.8.0 o versioni successive.You must make sure that you are using Azure PowerShell Cmdlets V0.8.0 or above. Per altre informazioni, vedere la pagina relativa ai Download di Azure.For more information, see Azure Downloads.

Aggiungere l'estensioneAdd the extension

Per aggiungere l'estensione AzureLogCollector, è possibile usare i cmdlet di Microsoft Azure PowerShell o le API REST di gestione dei servizi.You can use Microsoft Azure PowerShell cmdlets or Service Management REST APIs to add the AzureLogCollector extension.

Per i servizi cloud è possibile usare il cmdlet di Azure Powershell esistente, Set-AzureServiceExtension, per abilitare l'estensione per le istanze del ruolo servizio cloud.For Cloud Services, the existing Azure Powershell cmdlet, Set-AzureServiceExtension, can be used to enable the extension on Cloud Service role instances. Ogni volta che questa estensione viene abilitata tramite questo cmdlet, viene attivata la raccolta di log nelle istanze del ruolo selezionate dei ruoli specificati.Every time this extension is enabled through this cmdlet, log collection is triggered on the selected role instances of selected roles.

Per le macchine virtuali è possibile usare il cmdlet di Azure Powershell esistente, Set-AzureVMExtension, per abilitare l'estensione per le macchine virtuali.For Virtual Machines, the existing Azure Powershell cmdlet, Set-AzureVMExtension, can be used to enable the extension on Virtual Machines. Ogni volta che questa estensione viene abilitata tramite i cmdlet, viene attivata la raccolta di log in ogni istanza.Every time this extension is enabled through the cmdlets, log collection is triggered on each instance.

Internamente, questa estensione usa le configurazioni PublicConfiguration e PrivateConfiguration basate su JSON.Internally, this extension uses the JSON-based PublicConfiguration and PrivateConfiguration. Di seguito è riportato il layout del codice JSON di esempio per la configurazione pubblica e privata.The following is the layout of a sample JSON for public and private configuration.

PublicConfigurationPublicConfiguration

{
    "Instances":  "*",
    "Mode":  "Full",
    "SasUri":  "SasUri to your storage account with sp=wl",
    "AdditionalData":
    [
      {
              "Name":  "StorageData",
              "Location":  "%roleroot%storage",
              "SearchPattern":  "*.*",
              "Recursive":  "true"
      },
      {
            "Name":  "CustomDataFolder2",
            "Location":  "c:\customFolder",
            "SearchPattern":  "*.log",
            "Recursive":  "false"
      },
    ]
}

PrivateConfigurationPrivateConfiguration

{

}

Nota

Per questa estensione non richiede l'uso della configurazione privateConfiguration.This extension doesn’t need privateConfiguration. È semplicemente possibile specificare una struttura vuota per l'argomento – PrivateConfiguration .You can just provide an empty structure for the –PrivateConfiguration argument.

È possibile seguire uno dei due passaggi seguenti per aggiungere AzureLogCollector a uno o più istanze di un servizio Cloud o di una macchina virtuale dei ruoli selezionati, che attiva le raccolte in ogni macchina virtuale per eseguire e inviare i file raccolti all'account Azure specificato.You can follow one of the two following steps to add the AzureLogCollector to one or more instances of a Cloud Service or Virtual Machine of selected roles, which triggers the collections on each VM to run and send the collected files to Azure account specified.

Aggiunta come estensione del servizioAdding as a Service Extension

  1. Seguire le istruzioni per la connessione di Azure PowerShell alla sottoscrizione.Follow the instructions to connect Azure PowerShell to your subscription.
  2. Specificare il nome del servizio, lo slot, i ruoli e le istanze del ruolo per cui si vuole aggiungere e abilitare l'estensione AzureLogCollector.Specify the service name, slot, roles, and role instances to which you want to add and enable the AzureLogCollector extension.

     #Specify your cloud service name
     $ServiceName = 'extensiontest2'
    
     #Specify the slot. 'Production' or 'Staging'
     $slot = 'Production'
    
     #Specified the roles on which the extension will be installed and enabled
     $roles = @("WorkerRole1","WebRole1")
    
     #Specify the instances on which extension will be installed and enabled.  Use wildcard * for all instances
     $instances = @("*")
    
     #Specify the collection mode, "Full" or "GA"
     $mode = "GA"
    
  3. Specificare la cartella dei dati aggiuntivi per cui verranno raccolti i file (questo passaggio è facoltativo).Specify the additional data folder for which files will be collected (this step is optional).

     #add one location
     $a1 = New-Object PSObject
    
     $a1 | Add-Member -MemberType NoteProperty -Name "Name" -Value "StorageData"
     $a1 | Add-Member -MemberType NoteProperty -Name "SearchPattern" -Value "*"
     $a1 | Add-Member -MemberType NoteProperty -Name "Location" -Value "%roleroot%storage"  #%roleroot% is normally E: or F: drive
     $a1 | Add-Member -MemberType NoteProperty -Name "Recursive" -Value "true"
    
     $AdditionalDataList+= $a1
           #more locations can be added....
    

    Nota

    È possibile usare token %roleroot% per specificare l'unità radice del ruolo, perché non usa un'unità fissa.You can use token %roleroot% to specify the role root drive since it doesn’t use a fixed drive.

  4. Specificare il nome e la chiave dell'account di archiviazione di Azure in cui verranno caricati i file raccolti.Provide the Azure storage account name and key to which collected files will be uploaded.

     $StorageAccountName = 'YourStorageAccountName'
     $StorageAccountKey  = ‘YouStorageAccountKey'
    
  5. Chiamare il cmdlet SetAzureServiceLogCollector.ps1 (incluso alla fine dell'articolo) come indicato di seguito per abilitare l'estensione AzureLogCollector per un servizio cloud.Call the SetAzureServiceLogCollector.ps1 (included at the end of the article) as follows to enable the AzureLogCollector extension for a Cloud Service. Al termine dell'esecuzione, il file caricato sarà disponibile in https://YouareStorageAccountName.blob.core.windows.net/vmlogsOnce the execution is completed, you can find the uploaded file under https://YouareStorageAccountName.blob.core.windows.net/vmlogs

     .\SetAzureServiceLogCollector.ps1 -ServiceName YourCloudServiceName  -Roles $roles  -Instances $instances –Mode $mode -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -AdditionDataLocationList $AdditionalDataList
    

Di seguito è riportata la definizione dei parametri passati allo script.The following is the definition of the parameters passed to the script. (Copiati anche sotto.)(This is copied below as well.)

[CmdletBinding(SupportsShouldProcess = $true)]

param (
  [Parameter(Mandatory=$true)]
[string]   $ServiceName,

[Parameter(Mandatory=$false)]
[string[]] $Roles ,

[Parameter(Mandatory=$false)]
[string[]] $Instances,

[Parameter(Mandatory=$false)]
[string]   $Slot = 'Production',

[Parameter(Mandatory=$false)]
[string]   $Mode = 'Full',

[Parameter(Mandatory=$false)]
[string]   $StorageAccountName,

[Parameter(Mandatory=$false)]
[string]   $StorageAccountKey,

[Parameter(Mandatory=$false)]
[PSObject[]] $AdditionDataLocationList = $null
)
  • ServiceName: nome del servizio cloud.ServiceName: Your cloud service name.
  • Roles: elenco di ruoli, ad esempio "WebRole1" o "WorkerRole1".Roles: A list of roles, such as “WebRole1” or ”WorkerRole1”.
  • Istances: elenco di nomi di istanze del ruolo separati da virgole; usare la stringa con caratteri jolly ("") per tutte le istanze del ruolo.Instances: A list of the names of role instances separated by comma -- use the wildcard string (“”) for all role instances.
  • Slot: nome dello slot.Slot: Slot name. "Production" o "Staging".“Production” or “Staging”.
  • Mode: modalità di raccolta.Mode: Collection mode. "Full" o "GA".“Full” or “GA”.
  • StorageAccountName: nome dell'account di archiviazione di Azure per l'archiviazione dei dati raccolti.StorageAccountName: Name of Azure storage account for storing collected data.
  • StorageAccountKey: nome della chiave dell'account di archiviazione di Azure.StorageAccountKey: Name of Azure storage account key.
  • AdditionalDataLocationList: elenco con la struttura seguente:AdditionalDataLocationList: A list of the following structure:

    {
    String Name,
    String Location,
    String SearchPattern,
    Bool   Recursive
    }
    

Aggiunta come estensione VMAdding as a VM Extension

Seguire le istruzioni per la connessione di Azure PowerShell alla sottoscrizione.Follow the instructions to connect Azure PowerShell to your subscription.

  1. Specificare il nome del servizio, la macchina virtuale e la modalità di raccolta.Specify the service name, VM, and the collection mode.

     #Specify your cloud service name
     $ServiceName = 'YourCloudServiceName'
    
     #Specify the VM name
     $VMName = "'YourVMName'"
    
     #Specify the collection mode, "Full" or "GA"
     $mode = "GA"
    
     Specify the additional data folder for which files will be collected (this step is optional).
    
     #add one location
     $a1 = New-Object PSObject
    
     $a1 | Add-Member -MemberType NoteProperty -Name "Name" -Value "StorageData"
     $a1 | Add-Member -MemberType NoteProperty -Name "SearchPattern" -Value "*"
     $a1 | Add-Member -MemberType NoteProperty -Name "Location" -Value "%roleroot%storage"  #%roleroot% is normally E: or F: drive
     $a1 | Add-Member -MemberType NoteProperty -Name "Recursive" -Value "true"
    
     $AdditionalDataList+= $a1
           #more locations can be added....
    
  2. Specificare il nome e la chiave dell'account di archiviazione di Azure in cui verranno caricati i file raccolti.Provide the Azure storage account name and key to which collected files will be uploaded.

     $StorageAccountName = 'YourStorageAccountName'
     $StorageAccountKey  = ‘YouStorageAccountKey'
    
  3. Chiamare il cmdlet SetAzureVMLogCollector.ps1 (incluso alla fine dell'articolo) come indicato di seguito per abilitare l'estensione AzureLogCollector per un servizio cloud.Call the SetAzureVMLogCollector.ps1 (included at the end of the article) as follows to enable the AzureLogCollector extension for a Cloud Service. Al termine dell'esecuzione, è possibile trovare il file caricato in https://NomeAccountArchiviazione.blob.core.windows.net/vmlogsOnce the execution is completed, you can find the uploaded file under https://YouareStorageAccountName.blob.core.windows.net/vmlogs

Di seguito è riportata la definizione dei parametri passati allo script.The following is the definition of the parameters passed to the script. (Copiati anche sotto.)(This is copied below as well.)

[CmdletBinding(SupportsShouldProcess = $true)]

param (
    [Parameter(Mandatory=$true)]
  [string]   $ServiceName,

  [Parameter(Mandatory=$false)]
  [string] $VMName ,

    [Parameter(Mandatory=$false)]
  [string]   $Mode = 'Full',

  [Parameter(Mandatory=$false)]
  [string]   $StorageAccountName,

  [Parameter(Mandatory=$false)]
  [string]   $StorageAccountKey,

  [Parameter(Mandatory=$false)]
  [PSObject[]] $AdditionDataLocationList = $null
  )
  • ServiceName: nome del servizio cloud.ServiceName: Your cloud service name.
  • VMName: nome della macchina virtuale.VMName The name of the VM.
  • Mode: modalità di raccolta.Mode: Collection mode. "Full" o "GA".“Full” or “GA”.
  • StorageAccountName: nome dell'account di archiviazione di Azure per l'archiviazione dei dati raccolti.StorageAccountName: Name of Azure storage account for storing collected data.
  • StorageAccountKey: nome della chiave dell'account di archiviazione di Azure.StorageAccountKey: Name of Azure storage account key.
  • AdditionalDataLocationList: elenco con la struttura seguente:AdditionalDataLocationList: A list of the following structure:
      {
        String Name,
        String Location,
        String SearchPattern,
        Bool   Recursive
      }

File script di PowerShell per l'estensioneExtention PowerShell Script files

SetAzureServiceLogCollector.ps1SetAzureServiceLogCollector.ps1

[CmdletBinding(SupportsShouldProcess = $true)]

param (
              [Parameter(Mandatory=$true)]
              [string]   $ServiceName,

              [Parameter(Mandatory=$false)]
              [string[]] $Roles ,

              [Parameter(Mandatory=$false)]
              [string[]] $Instances = '*',

              [Parameter(Mandatory=$false)]
              [string]   $Slot = 'Production',

              [Parameter(Mandatory=$false)]
              [string]   $Mode = 'Full',

              [Parameter(Mandatory=$false)]
              [string]   $StorageAccountName,

              [Parameter(Mandatory=$false)]
              [string]   $StorageAccountKey,

              [Parameter(Mandatory=$false)]
              [PSObject[]] $AdditionDataLocationList = $null
        )

$publicConfig = New-Object PSObject

if ($Instances -ne $null -and $Instances.Count -gt 0)  #Instances should be seperated by ,
{
    $instanceText = $Instances[0]
    for ($i = 1;$i -lt $Instances.Count;$i++)
    {
          $instanceText = $instanceText+ "," + $Instances[$i]
      }
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Instances" -Value $instanceText
}
else  #For all instances if not specified.  The value should be a space or *
{
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Instances" -Value " "
}

if ($Mode -ne $null )
{
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Mode" -Value $Mode
}
else
{
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Mode" -Value "Full"
}

#
#we need to get the Sasuri from StorageAccount and containers
#
$context = New-AzureStorageContext -Protocol https -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey

$ContainerName = "azurelogcollectordata"
$existingContainer = Get-AzureStorageContainer -Context $context |  Where-Object { $_.Name -like $ContainerName}
if ($existingContainer -eq $null)
{
    "Container ($ContainerName) doesn't exist. Creating it now.."
    New-AzureStorageContainer -Context $context -Name $ContainerName -Permission off
}

$ExpiryTime =  [DateTime]::Now.AddMinutes(120).ToString("o")
$SasUri = New-AzureStorageContainerSASToken -ExpiryTime $ExpiryTime -FullUri -Name $ContainerName -Permission rwl -Context $context
$publicConfig | Add-Member -MemberType NoteProperty -Name "SasUri" -Value $SasUri

#
#Add AdditionalData to collect data from additional folders
#
if ($AdditionDataLocationList -ne $null )
{
  $publicConfig | Add-Member -MemberType NoteProperty -Name "AdditionalData" -Value $AdditionDataLocationList
}

#
# Convert it to JSON format
#
$publicConfigJSON = $publicConfig | ConvertTo-Json
"publicConfig is:  $publicConfigJSON"

#we just provide a empty privateConfig object
$privateconfig = "{
}"

if ($Roles -ne $null)
{
      Set-AzureServiceExtension -Service $ServiceName -Slot $Slot -Role $Roles -ExtensionName 'AzureLogCollector' -ProviderNamespace Microsoft.WindowsAzure.Compute -PublicConfiguration $publicConfigJSON -PrivateConfiguration $privateconfig -Version 1.0 -Verbose
}
else
{
      Set-AzureServiceExtension -Service $ServiceName -Slot $Slot  -ExtensionName 'AzureLogCollector' -ProviderNamespace Microsoft.WindowsAzure.Compute -PublicConfiguration $publicConfigJSON -PrivateConfiguration $privateconfig -Version 1.0 -Verbose
}

#
#This is an optional step: generate a sasUri to the container so it can be shared with other people if nened
#
$SasExpireTime = [DateTime]::Now.AddMinutes(120).ToString("o")
$SasUri = New-AzureStorageContainerSASToken -ExpiryTime $ExpiryTime -FullUri -Name $ContainerName -Permission rl -Context $context
$SasUri = $SasUri + "&restype=container&comp=list"
Write-Output "The container for uploaded file can be accessed using this link:`r`n$sasuri"

SetAzureVMLogCollector.ps1SetAzureVMLogCollector.ps1

[CmdletBinding(SupportsShouldProcess = $true)]

param (
              [Parameter(Mandatory=$true)]
              [string]   $ServiceName,

              [Parameter(Mandatory=$false)]
              [string] $VMName ,

              [Parameter(Mandatory=$false)]
              [string]   $Mode = 'Full',

              [Parameter(Mandatory=$false)]
              [string]   $StorageAccountName,

              [Parameter(Mandatory=$false)]
              [string]   $StorageAccountKey,

              [Parameter(Mandatory=$false)]
              [PSObject[]] $AdditionDataLocationList = $null
        )

$publicConfig = New-Object PSObject
$publicConfig | Add-Member -MemberType NoteProperty -Name "Instances" -Value "*"

if ($Mode -ne $null )
{
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Mode" -Value $Mode
}
else
{
    $publicConfig | Add-Member -MemberType NoteProperty -Name "Mode" -Value "Full"
}

#
#we need to get the Sasuri from StorageAccount and containers
#
$context = New-AzureStorageContext -Protocol https -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey

$ContainerName = "azurelogcollectordata"
$existingContainer = Get-AzureStorageContainer -Context $context |  Where-Object { $_.Name -like $ContainerName}
if ($existingContainer -eq $null)
{
    "Container ($ContainerName) doesn't exist. Creating it now.."
    New-AzureStorageContainer -Context $context -Name $ContainerName -Permission off
}

$ExpiryTime =  [DateTime]::Now.AddMinutes(90).ToString("o")
$SasUri = New-AzureStorageContainerSASToken -ExpiryTime $ExpiryTime -FullUri -Name $ContainerName -Permission rwl -Context $context
$publicConfig | Add-Member -MemberType NoteProperty -Name "SasUri" -Value $SasUri

#
#Add AdditionalData to collect data from additional folders
#
if ($AdditionDataLocationList -ne $null )
{
  $publicConfig | Add-Member -MemberType NoteProperty -Name "AdditionalData" -Value $AdditionDataLocationList
}

#
# Convert it to JSON format
#
$publicConfigJSON = $publicConfig | ConvertTo-Json

Write-Output "PublicConfigurtion is: \r\n$publicConfigJSON"

#
#we just provide a empty privateConfig object
#
$privateconfig = "{
}"

if ($VMName -ne $null )
{
      $VM = Get-AzureVM -ServiceName $ServiceName -Name $VMName
      $VM.VM.OSVirtualHardDisk.OS

      if ($VM.VM.OSVirtualHardDisk.OS -like '*Windows*')
      {
            Set-AzureVMExtension -VM $VM -ExtensionName "AzureLogCollector" -Publisher Microsoft.WindowsAzure.Compute -PublicConfiguration $publicConfigJSON -PrivateConfiguration $privateconfig -Version 1.* | Update-AzureVM -Verbose

            #
            #We will check the VM status to find if operation by extension has been completed or not. The completion of the operation,either succeed or fail, can be indicated by
            #the presence of SubstatusList field.
            #
            $Completed = $false
            while ($Completed -ne $true)
            {
                    $VM = Get-AzureVM -ServiceName $ServiceName -Name $VMName
                    $status = $VM.ResourceExtensionStatusList | Where-Object {$_.HandlerName -eq "Microsoft.WindowsAzure.Compute.AzureLogCollector"}

                    if ( ($status.Code -ne 0) -and ($status.Status -like '*error*'))
                    {
                        Write-Output "Error status is returned: $($Status.ExtensionSettingStatus.FormattedMessage.Message)."
                          $Completed = $true
                    }
                    elseif (($status.ExtensionSettingStatus.SubstatusList -eq $null -or $status.ExtensionSettingStatus.SubstatusList.Count -lt 1))
                    {
                          $Completed = $false
                          Write-Output "Waiting for operation to complete..."
                    }
                    else
                    {
                          $Completed = $true
                          Write-Output "Operation completed."

                    $UploadedFileUri = $Status.ExtensionSettingStatus.SubStatusList[0].FormattedMessage.Message
                          $blob = New-Object Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob($UploadedFileUri)

                  #
                        # This is an optional step:  For easier access to the file, we can generate a read-only SasUri directly to the file
                          #
                          $ExpiryTimeRead =  [DateTime]::Now.AddMinutes(120).ToString("o")
                          $ReadSasUri = New-AzureStorageBlobSASToken -ExpiryTime $ExpiryTimeRead  -FullUri  -Blob  $blob.name -Container $blob.Container.Name -Permission r -Context $context

                        Write-Output "The uploaded file can be accessed using this link: $ReadSasUri"

                          #
                          #This is an optional step:  Remove the extension after we are done
                          #
                          Get-AzureVM -ServiceName $ServiceName -Name $VMName | Set-AzureVMExtension -Publisher Microsoft.WindowsAzure.Compute -ExtensionName "AzureLogCollector" -Version 1.* -Uninstall | Update-AzureVM -Verbose

                    }
                    Start-Sleep -s 5
            }
      }
      else
      {
          Write-Output "VM OS Type is not Windows, the extension cannot be enabled"
      }

}
else
{
  Write-Output "VM name is not specified, the extension cannot be enabled"
}

Passaggi successiviNext Steps

È ora possibile esaminare o copiare i log da una posizione semplificata.Now you can examine or copy your logs from one very simple location.