Public/Seq.ps1

function Open-Seq ([string]$url, [string]$apiKey, $properties = @{ })
{
    return @{ Url = $url; ApiKey = $apiKey; Properties = $properties.Clone() }
}

function Send-SeqEvent (
        $seq,
        [string]$text,
        [string]$level,
        $properties = @{ },
        [switch]$template,
        [System.Exception]$exception = $null)
{
    if (-not $level)
    {
        $level = 'Information'
    }

    if (@('Verbose', 'Debug', 'Information', 'Warning', 'Error', 'Fatal') -notcontains $level)
    {
        $level = 'Information'
    }

    $allProperties = $seq["Properties"].Clone()
    $allProperties += $properties

    $messageTemplate = "{Text}"

    if ($template)
    {
        $messageTemplate = $text;
    }
    else
    {
        $allProperties += @{ Text = $text; }
    }

    $ex = "null";
    if ($exception)
    {
        $ex = ($exception.ToString() | ConvertTo-Json)
    }

    $body = "{""Events"": [ {
    ""Timestamp"": ""$([System.DateTimeOffset]::Now.ToString('o'))"",
    ""Level"": ""$level"",
    ""Exception"": $ex,
    ""MessageTemplate"": $($messageTemplate | ConvertTo-Json),
    ""Properties"": $($allProperties | ConvertTo-Json) }]}"


    $target = "$($seq["Url"])/api/events/raw?apiKey=$($seq["ApiKey"])"

    Invoke-RestMethod -Uri $target -Body $body -ContentType "application/json" -Method POST
}

function Send-SeqMessage
{
    param (
        [string]$uri,
        [string]$apiKey,
        [string]$message,
        [hashtable]$properties = @{},
        [string]$level = "Verbose"
    )

    try
    {
        $seq = Open-Seq -url $uri -apiKey $apiKey -properties $properties
        Send-SeqEvent $seq $message -level $level
    }
    catch
    {
        Write-Host "Failed to send motification to Seq: $_"
    }
}