Public/Helpers/Write-Log.ps1

function Write-Log
{
    [CmdletBinding(PositionalBinding = $true)]
    param
    (
        [Parameter(Mandatory = $false)][string]$LogText,
        [Parameter(Mandatory = $false)][ValidateSet('error', 'normal', 'warning')][string]$LogType = 'normal',
        [Parameter(Mandatory = $false)][string]$LogFileName = $env:LogPath,
        [Parameter(Mandatory = $false)][Object]$ErrorObject,
        [Parameter(Mandatory = $false)][string]$PersonId,
        [Parameter(Mandatory = $false)][String]$FunctionName
    )
    

    $dateTime = (Get-Date).ToString('s')

    $user = $env:USERNAME
    if ($user.Length -lt 1) 
    {
        $user = $env:USER
    }
    
    if ($PSBoundParameters.Keys -notcontains "FunctionName")
    {
        $functionName = (Get-PSCallStack)[1].Command
    }

    $personIdStr = ' '
    if ($PersonId.Length -gt 2)
    {
        $personIdStr = $PersonId
    }

    if ($LogType -eq 'error' -or $ErrorObject -ne $null) 
    {
        $logColor = 'Magenta'

        $errorResponse = ''
        try
        {
            $streamReader = [System.IO.StreamReader]::new($ErrorObject.Exception.Response.GetResponseStream())
            $ErrResp = $streamReader.ReadToEnd() | ConvertFrom-Json
            $streamReader.Close()
            
            if ($ErrResp.error.message.Length -gt 1)
            {
                $errorResponse = " :: ErrResponse: $($ErrResp.error.message)"
            }
            
        }
        catch
        {
        }

        $logMsg = "$dateTime :: $user :: $personIdStr :: $LogType :: $functionName :: $LogText$errorResponse :: ErrorMessage: ""$($ErrorObject.Exception.Message -replace '\r|\n', ' ')"" :: Error Details: ""$($ErrorObject.ErrorDetails.Message -replace '\r|\n', ' ')"" :: StackTrace: ""$($ErrorObject.ScriptStackTrace -replace '\r|\n', ' ')"""
    } 
    elseif ($LogType -eq 'warning') 
    {
        $logColor = 'Yellow'
        $logMsg = "$dateTime :: $user :: $personIdStr :: $LogType :: $functionName :: $LogText"
    } 
    else 
    {
        $logColor = 'Cyan'
        $logMsg = "$dateTime :: $user :: $personIdStr :: $LogType :: $functionName :: $LogText"
    }


    Write-Host -ForegroundColor $logColor $logMsg
    

    try
    {
        $logMsg | Out-File $LogFileName -Append
    }
    catch
    {
        Write-Host -ForegroundColor Red "Error logging message to "$LogFilePath" Message: $($_.Exception.Message)"
    }



}