Skip to main content

Write custom logs via PowerShell

using namespace System.Net

# Input bindings are passed in via param block.
param(
$Request, $TriggerMetadata)

# Interact with query parameters or the body of the request.
$LogContentcustomerId = "" $Request.Body.LogContent
sharedKey
= "" $LogType = $Request.Body.LogType
""
Function Build-Signature ($customerId, $sharedKey, $date, $contentLength, $method, $contentType, $resource){
  $xHeaders = "x-ms-date:" + $date
  $stringToHash = $method + "`n" + $contentLength + "`n" + $contentType + "`n" + $xHeaders + "`n" + $resource
 
  $bytesToHash = [Text.Encoding]::UTF8.GetBytes($stringToHash)
  $keyBytes = [Convert]::FromBase64String($sharedKey)
 
  $sha256 = New-Object System.Security.Cryptography.HMACSHA256
  $sha256.Key = $keyBytes
  $calculatedHash = $sha256.ComputeHash($bytesToHash)
  $encodedHash = [Convert]::ToBase64String($calculatedHash)
  $authorization = 'SharedKey {0}:{1}' -f $customerId,$encodedHash
  return $authorization
}
 
Function Post-LogAnalyticsData ($customerId, $sharedKey, $body, $logType){
  $method = "POST"
  $contentType = "application/json"
  $resource = "/api/logs"
  $rfc1123date = ([DateTime]::UtcNow).ToString("r")
  $contentLength = $body.Length
  $signature = Build-Signature -customerId $customerId -sharedKey $sharedKey -date $rfc1123date -contentLength $contentLength -method $method -contentType $contentType -resource $resource
   
  $uri = "https://" + $customerId + ".ods.opinsights.azure.com" + $resource + "?api-version=2016-04-01"
 
  $headers = @{
  "Authorization" = $signature;
  "Log-Type" = $logType;
  "x-ms-date" = $rfc1123date;
  }
 
  $response = Invoke-WebRequest -Uri $uri -Method $method -ContentType $contentType -Headers $headers -Body $body -UseBasicParsing
  return $response.StatusCode
}

$customerId = ""
$sharedKey = ""
$LogType = ""

$Properties = [Ordered] @{
  "ComputerName" = $env:computername
  "User" = $env:Username
}

$CustomLogs = New-Object -TypeName "PSObject" -Property $Properties | ConvertTo-JSON -Depth 10


#Submit the data to the API endpoint
$params = @{
  CustomerId = $customerId
  SharedKey = $sharedKey
  Body = ([System.Text.Encoding]::UTF8.GetBytes($CustomLogs))
  LogType = $LogType
}
$LogResponse = Post-LogAnalyticsData @params
$LogResponse