Public/Get-iPilotAutomationJobLogs.ps1

Function Get-iPilotAutomationJobLogs {
    <#
        .Description
        Retrieves logs from an Azure Automation Runbook

        .Parameter AutomationResourceGroupName
        Azure Automation Resource Group Name

        .Parameter AutomationAccountName
        Azure Automation Account Name

        .Parameter RunbookName
        Azure Automation Account Runbook Name

        .Example
        Get-iPilotAutomationJobLogs -AutomationResourceGroupName "contoso-automation-rg" -AutomationAccountName "Contoso-AutomationAccount" -RunbookName "SynciPilotUsers"
    #>

    Param (
        [System.String]  [Parameter(Mandatory = $true)]
            $AutomationResourceGroupName,
        [System.String] [Parameter(Mandatory = $true)] 
            $AutomationAccountName,
        [System.String] [Parameter(Mandatory = $true)]
            $RunbookName
    )

    # Import/Install Az.Accounts
    Write-Output "Importing/Installing prerequisite Az.Accounts module"
    if ((Get-Module -ListAvailable).Name -notcontains "Az.Accounts") {
        Try {
            Import-Module Az.Accounts
        } Catch {
            Install-Module Az.Accounts
        }
    }

    # Import/Install Az.Automation
    Write-Output "Importing/Installing prerequisite Az.Automation module"
    if ((Get-Module -ListAvailable).Name -notcontains "Az.Automation") {
        Try {
            Import-Module Az.Automation
        } Catch {
            Install-Module Az.Automation
        }
    }
    Login-AzAccount

    # Start Azure Automation Job
    $StartJob = Read-Host -Prompt "Start new iPilot User Sync Azure Runbook Automation Job? Y or N"
    if ($StartJob -eq "Y") {
        $AutomationRunbookJob = Start-AzAutomationRunbook -ResourceGroupName $AutomationResourceGroupName `
            -AutomationAccountName $AutomationAccountName -Name $RunbookName
    }
    else {
        $AutomationRunbookJob = Get-AzAutomationJob `
            -ResourceGroupName $AutomationResourceGroupName `
            -AutomationAccountName $AutomationAccountName | Select-Object RunbookName, StartTime, EndTime, Status, JobId | Out-GridView -Title "Select Job to get logs for:" -PassThru
    }

    $doLoop = $true
    While ($doLoop) {
        $AutomationRunbookJob = Get-AzAutomationJob -ResourceGroupName $AutomationResourceGroupName `
            -AutomationAccountName $AutomationAccountName -Id $AutomationRunbookJob.JobId
        $status = $AutomationRunbookJob.Status
        $doLoop = (($status -ne "Completed") -and ($status -ne "Failed") -and ($status -ne "Suspended") -and ($status -ne "Stopped"))
        Write-Host "$(Get-Date) | Waiting for $($AutomationRunbookJob.RunbookName) Azure Automation Job to complete...(Status: $($AutomationRunbookJob.Status))"
    }

    $JobOutputRecords = Get-AzAutomationJobOutput `
        -ResourceGroupName $AutomationResourceGroupName `
        -AutomationAccountName $AutomationAccountName -Id $AutomationRunbookJob.JobId -Stream Any | 
    Get-AzAutomationJobOutputRecord

    # Grid View
    $Logs = $JobOutputRecords | 
        Select-Object time, @{Name = 'Message' ; Expression = { $_.Value.Values } } |   
            Format-Table -Wrap
    $LogFilePath = "$($env:APPDATA)\iPilot\$($AutomationRunbookJob.StartTime.DateTime | Get-Date -Format FileDateTime)-iPilotUserSync.log"
    $Logs | Out-File $LogFilePath -Force -Verbose

    # View logs with coloring
    Invoke-RestMethod "https://gist.github.com/mklement0/243ea8297e7db0e1c03a67ce4b1e765d/raw/Out-HostColored.ps1" | Invoke-Expression
    $Logs  | 
        Out-HostColored @{
            'ERROR'   = 'red'
            'VERBOSE' = 'yellow'
            'DEBUG'   = 'magenta'
        } -WholeLine
}