core/modules/monkeylogger/core/helpers/Get-FormattedMessage.ps1

# Monkey365 - the PowerShell Cloud Security Tool for Azure and Microsoft 365 (copyright 2022) by Juan Garrido
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Function Get-FormattedMessage {
    <#
        .SYNOPSIS
 
        .DESCRIPTION
 
        .INPUTS
 
        .OUTPUTS
 
        .EXAMPLE
 
        .NOTES
            Author : Juan Garrido
            Twitter : @tr1ana
            File Name : Get-FormattedMessage
            Version : 1.0
 
        .LINK
            https://github.com/silverhack/monkey365
    #>


    [cmdletbinding()]
    [OutputType([System.String])]
    Param (
        [System.Management.Automation.InformationRecord] $Log
    )
    Begin{
        $formattedMessage = $null
        #Check Log Level
        if($null -eq $Log.Level -or [String]::IsNullOrEmpty($Log.Level)){
            $Log.Level = 'info'
        }
        else{
            $Log.Level = $Log.Level.ToString().ToLower();
        }
        $formattedMessage = $null
    }
    Process{
        try{
            if($Log.MessageData -is [System.Management.Automation.ErrorRecord]){
                try{
                    if($null -ne $Log.MessageData.PsObject.Properties.Item('InvocationInfo') -and $null -ne $Log.MessageData.InvocationInfo){
                        if($null -ne $Log.MessageData.InvocationInfo.PsObject.Properties.Item('PositionMessage')){
                            $position = $Log.MessageData.InvocationInfo.PositionMessage
                        }
                        else{
                            $position = $null
                        }
                    }
                    else{
                        $position = $null
                    }
                }
                catch{
                    $position = $null
                }
                $formattedMessage = ("[{0}] - [{1}] - {2}. LineNumber: {3} - exception - {4} - {5}" -f `
                                    $Log.TimeGenerated.ToUniversalTime().ToString('HH:mm:ss:fff'), `
                                    $Log.Source, `
                                    $Log.MessageData.Exception.Message, `
                                    $position, `
                                    $Log.Computer, `
                                    [system.String]::Join(", ", $Log.Tags))
            }
            elseif($Log.MessageData -is [exception]){
                try{
                    if($null -ne $Log.MessageData.PsObject.Properties.Item('InvocationInfo')){
                        $position = $Log.MessageData.InvocationInfo.PositionMessage
                    }
                    else{
                        $position = $null
                    }
                }
                catch{
                    $position = $null
                }
                $formattedMessage = ("[{0}] - [{1}] - {2}. LineNumber: {3} - exception - {4} - {5}" -f `
                                    $Log.TimeGenerated.ToUniversalTime().ToString('HH:mm:ss:fff'), `
                                    $Log.Source, `
                                    $Log.MessageData, `
                                    $position, `
                                    $Log.Computer, `
                                    [system.String]::Join(", ", $Log.Tags))
            }
            elseif($Log.MessageData -is [System.AggregateException]){
                $formattedMessage = ("[{0}] - [{1}] - {2} - {3} - {4} - {5}" -f `
                                    $Log.TimeGenerated.ToUniversalTime().ToString('HH:mm:ss:fff'), `
                                    $Log.Source, `
                                    $Log.MessageData.Exception.InnerException.Message, `
                                    $Log.Level.ToString().ToLower(), `
                                    $Log.Computer, `
                                    [system.String]::Join(", ", $Log.Tags))
            }
            elseif($Log.MessageData -is [String]){
                $formattedMessage = '[{0}] - [{1}] - {2} - {3} - {4} - {5}' -f `
                                    $Log.TimeGenerated.ToUniversalTime().ToString('HH:mm:ss:fff'), `
                                    $Log.Source, `
                                    $Log.MessageData, `
                                    $Log.Level.ToString().ToLower(), `
                                    $Log.Computer, `
                                    [system.String]::Join(", ", $Log.Tags)
            }
            else{
                $formattedMessage = '[{0}] - [{1}] - {2} - {3} - {4} - {5}' -f `
                                    $Log.TimeGenerated.ToUniversalTime().ToString('HH:mm:ss:fff'), `
                                    $Log.Source, `
                                    ($Log.MessageData | Out-String), `
                                    $Log.Level.ToString().ToLower(), `
                                    $Log.Computer, `
                                    [system.String]::Join(", ", $Log.Tags)

            }
        }
        catch{
            Write-Verbose ("Unable to format message {0}" -f $Log.MessageData)
        }
    }
    End{
        if($formattedMessage){
            return $formattedMessage
        }
        else{
            return [string]::Empty
        }
    }
}