Summary: Downloading and viewings the blocking logs for the Azure Web Application Firewall (V2) is necessary to adjust the blocking rules for the WAF. Even when the WAF is in the default “discovery” mode, there still may be some default blocking behavior.
First, the Application Gateway which is hosting the WAF needs to be enabled to send its diagnostic logs to a Log Analytics Workspace in Azure. After creating the Log Analytics Workspace, enable the diagnostic log forwarding (this example is via the Azure Portal):

Select the logs and Log Analytics Workspace.

The following PowerShell script will download logs for the past 24hrs from the WAF’s Log Analytics Workspace and export a CSV of the results.
Get-WafLogs.ps1 (example):
<#
.DESCRIPTION
Gets WAF Logs
.EXAMPLE
PS >> .\Get-WafLogs.ps1
.NOTES
AUTHORS: Otto Helweg
LASTEDIT: March 7, 2021
VERSION: 1.0.1
POWERSHELL: Requires version 6
Update Execution Policy and Modules:
Set-ExecutionPolicy Bypass -Force
Login to Azure first:
Logout-AzAccount
Login-AzAccount -Subscription "<Subscription Name>"
Select-AzSubscription -Subscription "<Subscription Name>"
Example:
.\Get-WafLogs.ps1 -workspaceName <Workspace Name> -workspaceRG <Resource Group Name>
#>
param($workspaceName,$workspaceRG)
if (!($workspaceName)) {
$workspaceName = Read-Host "Workspace Name"
}
if (!($workspaceRG)) {
$workspaceRG = Read-Host "Resource Group Name"
}
$WorkspaceID = (Get-AzOperationalInsightsWorkspace -Name $workspaceName -ResourceGroupName $workspaceRG).CustomerID
$query = 'AzureDiagnostics | where ResourceProvider == "MICROSOFT.NETWORK" and Category == "ApplicationGatewayFirewallLog"'
$results = Invoke-AzOperationalInsightsQuery -WorkspaceId $WorkspaceID -Query $query -Timespan (New-TimeSpan -days 1)
# $results.results | export-csv c:\temp\LogAnalyticsLogs.csv -Delimiter "," -NoTypeInformation
$csvOutput = @()
foreach ($result in $results.Results) {
$rule = ""
$uri = ""
if ($result.details_file_s) {
$rule = (($result.details_file_s).Split("/")[1]).Split(".")[0]
} else {
$rule = "N/A"
}
$uri = "$($result.hostname_s)$($result.requestUri_s)"
$timeStamp = Get-Date $result.TimeGenerated -Format "dd/MM/yyyy HH:mm:ss"
# Write-Output "$timeStamp,$($result.clientIp_s),$uri,$($result.action_s),$($result.ruleSetType_s),$($result.ruleId_s),$rule,$($result.Message)"
Write-Host "." -NoNewline
$csvOutputItem = New-Object -Type PSObject -Property @{
TimeStamp = $timeStamp
ClientIP = $result.clientIp_s
URI = $uri
Action = $result.action_s
RuleSet = $result.ruleSetType_s
RuleID = $result.ruleId_s
RuleName = $rule
Message = $result.Message
} | Select-Object TimeStamp,ClientIP,URI,Action,RuleSet,RuleID,RuleName,Message
$csvOutput += $csvOutputItem
}
Write-Output ""
$csvFileName = "$((Get-Date).Year)$((Get-Date).Month.ToString('00'))$((Get-Date).Day.ToString('00'))$((Get-Date).Hour.ToString('00'))$((Get-Date).Minute.ToString('00'))$((Get-Date).Second.ToString('00'))-WAFLogs.csv"
Write-Output "Exporting to file .\$csvFileName"
$csvOutput | Export-Csv -Path .\$csvFileName -NoType
The output (formatted in Excel) shows the WAF logs based on which rule and action were applied. These logs can be used to fine tune the rules used when the WAF is in ‘blocking’ mode as well as viewing the actions taken by the WAF while in ‘discovery’ mode.

Enjoy!