Get IIS log location via powershell?

I am writing a script that would like to easily move between IIS servers to parse logs, but these servers store the logs in different locations. Some in C: / some in D: / some in W3SVC1, some in W3SVC3. I'd like PowerShell to look at this information on its own instead of manually editing it on each server. (Yes, I'm a lazy admin. #Automateallthetheings.)

Is this information available to PowerShell if I can pass it a domain or something?

+3


source to share


3 answers


I found this to work for me as I want to know the entire log directory of the sites.



Import-Module WebAdministration

foreach ($ WebSite in $ (get-website))
    {
    $ logFile = "$ ($ Website.logFile.directory) \ w3scv $ ($ website.id)". replace ("% SystemDrive%", $ env: SystemDrive)
    Write-host "$ ($ WebSite.name) [$ logfile]"
    } 

+7


source


Import-Module WebAdministration

$sitename = "mysite.com"
$site = Get-Item IIS:\Sites\$sitename
$id = $site.id
$logdir = $site.logfile.directory + "\w3svc" + $id

      



Thanks for Chris Harris for putting the site ID idea in my head. After that, I was able to search around and this led me to the WebAdministration module and examples of its use.

+3


source


Nice ... I updated your script a bit to ask IIS for the location of the log file.

    param($website = 'yourSite')

Import-Module WebAdministration

$site = Get-Item IIS:\Sites\$website
$id = $site.id
$logdir = $site.logfile.directory + "\w3svc" + $id

$time = (Get-Date -Format "HH:mm:ss"(Get-Date).addminutes(-30))
# Location of IIS LogFile
$File = "$logdir\u_ex$((get-date).ToString("yyMMdd")).log"
# Get-Content gets the file, pipe to Where-Object and skip the first 3 lines.
$Log = Get-Content $File | where {$_ -notLike "#[D,S-V]*" }
# Replace unwanted text in the line containing the columns.
$Columns = (($Log[0].TrimEnd()) -replace "#Fields: ", "" -replace "-","" -replace "\(","" -replace "\)","").Split(" ")
# Count available Columns, used later
$Count = $Columns.Length
# Strip out the other rows that contain the header (happens on iisreset)
$Rows = $Log | where {$_ -like "*500 0 0*"}
# Create an instance of a System.Data.DataTable
#Set-Variable -Name IISLog -Scope Global
$IISLog = New-Object System.Data.DataTable "IISLog"
# Loop through each Column, create a new column through Data.DataColumn and add it to the DataTable
foreach ($Column in $Columns) {
  $NewColumn = New-Object System.Data.DataColumn $Column, ([string])
  $IISLog.Columns.Add($NewColumn)
}
# Loop Through each Row and add the Rows.
foreach ($Row in $Rows) {
  $Row = $Row.Split(" ")
  $AddRow = $IISLog.newrow()
  for($i=0;$i -lt $Count; $i++) {
    $ColumnName = $Columns[$i]
    $AddRow.$ColumnName = $Row[$i]
  }
  $IISLog.Rows.Add($AddRow)
  }
  $IISLog | select @{n="DateTime"; e={Get-Date ("$($_.date) $($_.time)")}},csuristem,scstatus | ? { $_.DateTime -ge $time }

      

0


source







All Articles