param ( [Parameter(Mandatory = $false)][string] $inFile, [Parameter(Mandatory = $false)][string] $outFile, [Parameter(Mandatory = $false)][int] $lines = 0 ) if ([string]::IsNullOrWhiteSpace($inFile)) { $inFile = [System.Environment]::GetEnvironmentVariable("INFILE") } if ([string]::IsNullOrWhiteSpace($outFile)) { $outFile = [System.Environment]::GetEnvironmentVariable("OUTFILE") } $baseDate = (New-Object System.DateTime -ArgumentList @(1970, 1, 1, 0, 0, 0, [DateTimeKind]::Utc)).ToLocalTime() $builder = New-Object System.Text.StringBuilder $outputStream = [IO.File]::Open($outFile, [IO.FileMode]::Append, [IO.FileAccess]::Write, [IO.FileShare]::Read) $outputWriter = New-Object -TypeName System.IO.StreamWriter -ArgumentList @($outputStream, [Text.Encoding]::UTF8) Get-Content -Tail $lines -Wait -Path $inFile | ForEach-Object { $l = ConvertFrom-Json -InputObject $_ $r = $l.request; $userAgent = $r.headers.'User-Agent' | Select-Object -First 1 $referer = $r.headers.Referer | Select-Object -First 1 $commonLog = $builder .Clear() .Append($r.remote_ip) .Append(" - [") .Append($baseDate.AddSeconds($l.ts).ToString("yyyy-MM-dd HH:mm:ss.fff")) .Append("] """) .Append($r.host) .Append(""" ") .Append($r.method) .Append(" ") .Append($r.uri) .Append(" ") .Append($r.proto) .Append(" ") .Append($l.status) .Append(" ") .Append($l.size) .Append(" """) .Append($referer) .Append(""" """) .Append($userAgent) .Append("""") .ToString() Write-Output $commonLog $outputWriter.WriteLine($commonLog) $outputWriter.Flush() }