Classes/PsGadgetLogger.ps1

# PsGadgetLogger Class
# Automatic logging for all PsGadget operations

class PsGadgetLogger {
    [string]$LogFilePath
    [string]$SessionId
    [datetime]$StartTime

    # Constructor
    PsGadgetLogger() {
        $this.StartTime = Get-Date
        $this.SessionId = [System.Guid]::NewGuid().ToString().Substring(0, 8)
        
        # Get user home directory
        $UserHome = [Environment]::GetFolderPath("UserProfile")
        $LogDir = Join-Path -Path $UserHome -ChildPath ".psgadget/logs"
        
        # Ensure logs directory exists
        if (-not (Test-Path -Path $LogDir)) {
            $null = New-Item -Path $LogDir -ItemType Directory -Force
        }
        
        # Create log filename with timestamp
        $TimeStamp = $this.StartTime.ToString("yyyyMMdd-HHmmss")
        $LogFileName = "psgadget-$TimeStamp.log"
        $this.LogFilePath = Join-Path -Path $LogDir -ChildPath $LogFileName
        
        # Write session header
        $this.WriteHeader()
    }

    # Private method to write session header
    hidden [void] WriteHeader() {
        $Header = @(
            "=== PsGadget Session Started ===",
            "Timestamp: $($this.StartTime.ToString('yyyy-MM-dd HH:mm:ss'))",
            "Session ID: $($this.SessionId)",
            "OS: $([System.Environment]::OSVersion.VersionString)",
            "PowerShell: $($global:PSVersionTable.PSVersion.ToString())",
            "Module Version: 0.1.0",
            "User: $([System.Environment]::UserName)",
            "Computer: $([System.Environment]::MachineName)",
            "================================="
        )
        
        foreach ($Line in $Header) {
            $this.WriteToFile("HEADER", $Line)
        }
    }

    # Private method to write to file
    hidden [void] WriteToFile([string]$Level, [string]$Message) {
        $TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss.fff"
        $LogEntry = "[$TimeStamp] [$Level] $Message"
        
        try {
            Add-Content -Path $this.LogFilePath -Value $LogEntry -Encoding UTF8 -ErrorAction Stop
        } catch {
            # Silently continue if logging fails - don't break functionality
        }
    }

    # Public logging methods
    [void] WriteInfo([string]$Message) {
        $this.WriteToFile("INFO", $Message)
        Write-Verbose $Message
    }

    [void] WriteDebug([string]$Message) {
        $this.WriteToFile("DEBUG", $Message)
        Write-Debug $Message
    }

    [void] WriteTrace([string]$Message) {
        $this.WriteToFile("TRACE", $Message)
        # Trace level - only to file
    }

    [void] WriteError([string]$Message) {
        $this.WriteToFile("ERROR", $Message)
        Write-Warning $Message
    }
}