Public/New-Log.ps1

Function New-Log {
    <#
        .SYNOPSIS
        This takes in some parameters to make it easier to consistently log.

        .PARAMETER Level
        This indicates the level based on predefined types.
        Info, Warn, Err, Debug

        .PARAMETER LogFile
        This should be a file path to a file.

        .PARAMETER Message
        This is a string that will be printed to the log and screen.

        .EXAMPLE
        PS> New-Log -LogFile 'test.log' -Level ([LogLevel]::Info) -Message "Test"
        20240525 04:46:34.4667: Test
    #>


    param(
        [Parameter(Mandatory=$False)]
        [string]$LogFile,

        [Parameter(Mandatory=$False)]
        [ValidateSet("Info", "Warn", "Err", "Debug")]
        [string]$Level,

        [Parameter(Mandatory=$True)]
        [string]$Message
    )

    Try {
        # Format the Log
        $Time = Get-Date -AsUTC -Format 'yyyyMMdd hh:mm:ss.ffff'
        $OutMessage = "$Time`: $Message"

        # Write to the log file
        if ($LogFile) {
            $OutMessage | Out-File $LogFile
        }

        # Write to the screen
        Switch ($Level) {
            (Info)  { Write-Output $OutMessage  }
            (Warn)  { Write-Warning $OutMessage }
            (Err)   { Write-Error $OutMessage   }
            (Debug) { Write-Debug $OutMessage   }
            default             { Write-Output $OutMessage  }
        }
    } Catch {
        # We were unable to write out...
        Throw "Unable to complete log update.`r`n$_" 
    }
}