C# 如何将IIS W3C日志文件转换为CSV?

C# 如何将IIS W3C日志文件转换为CSV?,c#,powershell,iis-logs,C#,Powershell,Iis Logs,我想将IIS日志文件(W3C格式)解析为PowerShell或C#中的CSV或XLS文件 我在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 $Lo

我想将IIS日志文件(W3C格式)解析为PowerShell或C#中的CSV或XLS文件

我在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中的一列(使用excel打开end.CSV时)

我怎样才能解决这个问题


我希望输出文件中的列彼此分开。

我在PowerShell中快速而肮脏地读取这些日志的方法使用自定义函数。大多数情况下,只需使用
ConvertFrom CSV
并操作IIS日志文件格式的前几行即可满足cmdlet的期望

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
cmdlet将读取文件并有效地删除前几行注释。我们有意将初始filterm中的#fields行保留为包含列标题的行。在我们刚刚去掉#字段之后,我们就可以使用正确的CSV格式了

使用上述方法,您只需将
$path
更改为包含日志的位置。接下来的内容主要是展示与其他PowerShell筛选和cmdlet集成的示例


由于我们正在制作PowerShell对象,您可以对数据使用您想要的任何导出选项。导入
导出CSV
,您就可以开始了

您的powershell代码有什么问题?很好的一个+1,对于我来说,更多的逻辑名称应该是函数的
ConvertFrom-W3CIISLog
。在后期处理中,您使用的固定属性名称可能不在标头中。确实如此。这就是为什么我说接下来的内容主要是一个展示集成的示例。。。当然,你需要知道你正在处理的事情的专有名称。