Wednesday, July 13, 2022

Progressive Log file parsing for Windows servers- Powershell

 Clear-Host

######################################################

########File Configurations or Initialization#########

######################################################


#Update the path of the Log file. Not including the file name

#$logFilePath = "C:\Users\bobr\Desktop\LogFileParsing"

$logFilePath = "E:\APP_SERVERS\glassfish-4.1\glassfish4\glassfish\domains\walgreenmonet\logs"

#\\server1\glassfish-4.1\glassfish4\glassfish\domains\walgreenmonet\logs


#Update the Log File name with extension like server.log

$logFileName = "server.log"

$ParserFile = $logFilePath + "\" + $logFileName



$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path


#Create a pattern.txt file in the location where you have placed the script and

#add all the required unique pattern to line-by-line. It does simple match.

$patternFile = $ScriptDir + "\" + "pattern.txt"


# This file will be created automatically in the initial run and

# never modify this file content which is a numerical value to track file 

# line last read

$counterFile = $ScriptDir + "\" + "counterFile.log"


#File which you want to parse once it get archieved from the original source

#make sure you have a right pattern in place as it identified lastWriteTime to pick

$archivedFileNamePattern = "server.log_*"


# SMTP Relay server name

$smtp = "smtp.domain.com"


# E-mail to be sent to when the pattern matches with subject and body details

$from = "xyz@domain.com"

$to = "xyz@domain.com","abc@domain.com"

$subject = "Test Ignore: Walgreen: database connectivity issue server.log"

$body = "<B>This file contains the match found in accordance with pattern.txt file</B><BR>"


######################################################

###############End of Initialization###################

######################################################



$bodyContent = @()

$bodyContent = $bodyContent + $body 

$pattern = Get-Content $patternFile


#$pattern = @("SQLException","SQL")


If ( Test-Path $counterFile )

{

$lastLine = Get-Content -Path $counterFile

}

else

{

New-Item -Path $logFilePath -Name "counterFile.log" -ItemType File

New-Item -Path $logFilePath -Name "pattern.txt" -ItemType File

$count = Get-content $ParserFile | Measure-Object

$lastLine = $count.count

$lastLine|Out-File $counterFile

}

$newCount = Get-content $ParserFile | Measure-Object

$newLine = $newCount.Count

If ( $newLine -gt $lastLine )

{

$diff_Line = $newLine - $lastLine

#Write-Host "FromLineNum:$lastLine to ToLineNum:$newLine"

$matchedContent = Get-Content $ParserFile -Tail $diff_Line | Select-String -Pattern $pattern #-SimpleMatch

#Write-Host $matchedContent

$bodyContent = $bodyContent + $matchedContent

    $bodyAsString = $bodyContent | & {$ofs='<BR>';"$input"}

If ( $matchedContent )

{

#send e-mail

Send-MailMessage -From $from -To $to -Subject $subject -Body $bodyAsString -BodyAsHtml -SmtpServer $smtp

}

$lastLine = $newLine

$lastLine|Out-File $counterFile

}

ElseIF ( $newLine -lt $lastLine ) #check if a new file has been created and archiving older one with timestamp

{

#Read from the newly created file

$diff_Line = -1

#Write-Host "FromLineNum:0 to ToLineNum:$newLine"

$matchedContent = Get-Content $ParserFile -Tail $diff_Line | Select-String -Pattern $pattern #-SimpleMatch

#Write-Host $matchedContent

$bodyContent = $bodyContent + $matchedContent

# Get archived file lastline before overriding with newfile lastline

$archivedFileLastLine = $lastLine

$lastLine = $newLine

$lastLine|Out-File $counterFile

#Read the archived file to make sure we have read everything till the end of the file

#Get the archieved file name from recently modified date with a filename_*.log

$recentArchiveFileName = (Get-ChildItem -Path $logFilePath -Filter $archivedFileNamePattern |Sort-Object LastWriteTime | Select-Object -Last 1).FullName

$archievednewCount = Get-content $recentArchiveFileName | Measure-Object

$archievedNewLine = $archievednewCount.Count

if ( $archievedNewLine -gt $archivedFileLastLine )

{

$diff_Line = $archievedNewLine - $archivedFileLastLine

Write-Host "FromLineNum:$archivedFileLastLine to ToLineNum:$archievedNewLine"

$archievedMatchedContent = Get-Content $recentArchiveFileName -Tail $diff_Line | Select-String -Pattern $pattern #-SimpleMatch

#Write-Host $archievedMatchedContent

$bodyContent = $bodyContent + $archievedMatchedContent

$bodyAsString = $bodyContent | & {$ofs='<BR>';"$input"}

if ( $archievedMatchedContent )

{

#send e-mail

Send-MailMessage -From $from -To $to -Subject $subject -Body $bodyAsString -BodyAsHtml -SmtpServer $smtp

}

}

}

No comments:

Post a Comment