functions/private/Write-Log.ps1

function Write-Log {
    # write a message to the global log file
    [cmdletbinding()]
    param(
        [ValidateNotNullOrEmpty()]
        [string] $Message,
        [ValidateSet('Warning','Error','Verbose','Debug', 'Information')]
        [string] $Type = 'Information',
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string] $Log
    )
    process {
       
        #Get the info about the calling script, function etc
        $callinginfo = (Get-PSCallStack)[1]
        #Set Source Information
        $Source = (Get-PSCallStack)[1].Location
        #Set Component Information
        $Component = (Get-Process -Id $PID).ProcessName
        #Set PID Information
        $ProcessID = $PID
        #Obtain UTC offset
        $DateTime = New-Object -ComObject WbemScripting.SWbemDateTime
        $DateTime.SetVarDate($(Get-Date))
    $UtcValue = $DateTime.Value
    $UtcOffset = $UtcValue.Substring(21, $UtcValue.Length - 21)
    #Set the order
    switch($Type){
        'Warning' {
            $Severity = 2
        }#Warning
        'Error' {
            $Severity = 3
        }#Error
        'Verbose' {
            $Severity = 4
        }#Verbose
        'Debug' {
            $Severity = 5
        }#Debug
        'Information' {
            $Severity = 6
        }#Information
    }#Switch
    $Line = "$Message"

    switch($Severity){
        2{
            Write-Warning $Line
        }
        3{
                
            <# if($Message.Exception.Message){
                    $Line += = @"
                    Command: $($Message.InvocationInfo.MyCommand)"
                                    ScriptName: $($Message.InvocationInfo.Scriptname)"
                    Line Number: $($Message.InvocationInfo.ScriptLineNumber)"`
                                    Column Number: $($Message.InvocationInfo.OffsetInLine)"
                    Line: $($Message.InvocationInfo.Line)
    "@
                } #>

            Write-Error $Line
        }
        4{
            Write-Verbose $Line
        }
        5{
            Write-Debug $Line
        }
        6{
            Write-Host $Line
        }
    }
    #$Message|out-file $script:Log -append -encoding default
    $LogEntry = `
        "<![LOG[$Line]LOG]!>" +`
    "<time=""$(Get-Date -Format HH:mm:ss.fff)$($UtcOffset)"" " +`
        "date=""$(Get-Date -Format M-d-yyy)"" "  +`
        "component=""$($CallingInfo.FunctionName)"" " + `
        "context=""$([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)"" " +`
        "type=""$Severity"" " +`
        "thread=""$($ProcessID)"">"

    $Writer = new-object System.IO.StreamWriter $Log,$true
    $Writer.WriteLine($LogEntry.Replace("`r`n","`t"))
    $Writer.Close()
    $Writer.Dispose()
   
}
}