Как преобразовать файл журнала IIS W3C в CSV?

Я хочу преобразовать файл журнала IIS (в формате W3C) в файл CSV или XLS в PowerShell или C#.

Я пытаюсь использовать этот код в PowerShell:

$LogFolder = "C:\iislog\"
$LogFiles = [System.IO.Directory]::GetFiles($LogFolder, "*.log")
$LogTemp = "C:\iislog\end.csv"
# Logs will store each line of the log files in an array
$Logs = @()
# Skip the comment lines
$LogFiles | % { Get-Content $_ | where {$_ -notLike "#[D,F,S,V]*" } | % { $Logs += $_ } }

# Then grab the first header line, and adjust its format for later
$LogColumns = ( $LogFiles | select -first 6 | % { Get-Content $_ | where {$_ -Like "#[F]*" } } ) `
              -replace "#Fields: ", "" -replace "-","" -replace "\(","" -replace "\)",""

 # Temporarily, store the reformatted logs
Set-Content -LiteralPath $LogTemp -Value ( [System.String]::Format("{0}{1}{2}", $LogColumns, [Environment]::NewLine, ( [System.String]::Join( [Environment]::NewLine, $Logs) ) ) )
 # Read the reformatted logs as a CSV file
$Logs = Import-Csv -Path $LogTemp -Delimiter " "
 # Sample query : Select all unique users
$Logs | select -Unique csusername 

Но этот код не разделяет столбцы и печатает каждую строку в один столбец в CSV (при открытии end.csv с помощью excel).

Как я могу решить эту проблему?

Я хочу, чтобы столбцы отделялись друг от друга в выходном файле.


person Arman Feyzi    schedule 27.11.2018    source источник
comment
Что не так с вашим кодом powershell?   -  person Daniel W.    schedule 27.11.2018


Ответы (1)


Мой быстрый и грязный подход к чтению этих журналов в PowerShell использует пользовательскую функцию. В основном это просто вопрос использования ConvertFrom-CSV и манипулирования первыми несколькими строками формата файла журнала IIS, чтобы удовлетворить ожидания командлетов.

function ConvertIISLogFrom-CSV{

    [cmdletbinding()]
    param(
        [parameter(ValueFromPipelineByPropertyName=$true, Mandatory=$true)]
        [Alias("FullName")]
        [string]$File
    )
    process{
        Get-Content $file |  Where-Object{$_ -notmatch "^#[DSV]"} | ForEach-Object{$_ -replace '^#Fields: '} | ConvertFrom-Csv -Delimiter " "
    }
}

Get-ChildItem $path -Filter "ex*" | 
    Sort-Object creationdate -Descending | 
    Select -Last 1  |
    ConvertIISLogFrom-CSV | 
    Where-Object {$_."cs-username" -eq "username" -and $_."x-fullpath" -like "*error*"} |
    Select-Object date,time,"c-ip","cs-username","x-session","x-fullpath" |
    Format-Table -AutoSize

Командлет прочитает файл и эффективно удалит первые несколько строк комментариев. Мы намеренно оставляем строку #fields из начального фильтра, поскольку она содержит заголовок столбца. После того, как мы просто избавимся от #fields, останется правильный формат CSV.

Используя приведенное выше, вы можете просто изменить $path на место, содержащее журналы. То, что следует после этого, в основном является примером, демонстрирующим интеграцию с другими фильтрами PowerShell и командлетами.

Поскольку мы создаем объекты PowerShell, вы можете использовать любые параметры экспорта данных. Трубка в Export-CSV и все готово.

person Matt    schedule 27.11.2018
comment
Хороший +1, для меня более логичным именем было бы ConvertFrom-W3CIISLog для функции. В постобработке вы используете фиксированные имена свойств, которых может не быть в заголовках. - person ; 27.11.2018
comment
Верно. Вот почему я сказал То, что следует после этого, в основном является примером, показывающим интеграцию... Конечно, вам нужно знать имена собственные того, с чем вы имеете дело. - person Matt; 27.11.2018