-
-
Save 9to5IT/9620565 to your computer and use it in GitHub Desktop.
Function Log-Start{ | |
<# | |
.SYNOPSIS | |
Creates log file | |
.DESCRIPTION | |
Creates log file with path and name that is passed. Checks if log file exists, and if it does deletes it and creates a new one. | |
Once created, writes initial logging data | |
.PARAMETER LogPath | |
Mandatory. Path of where log is to be created. Example: C:\Windows\Temp | |
.PARAMETER LogName | |
Mandatory. Name of log file to be created. Example: Test_Script.log | |
.PARAMETER ScriptVersion | |
Mandatory. Version of the running script which will be written in the log. Example: 1.5 | |
.INPUTS | |
Parameters above | |
.OUTPUTS | |
Log file created | |
.NOTES | |
Version: 1.0 | |
Author: Luca Sturlese | |
Creation Date: 10/05/12 | |
Purpose/Change: Initial function development | |
Version: 1.1 | |
Author: Luca Sturlese | |
Creation Date: 19/05/12 | |
Purpose/Change: Added debug mode support | |
.EXAMPLE | |
Log-Start -LogPath "C:\Windows\Temp" -LogName "Test_Script.log" -ScriptVersion "1.5" | |
#> | |
[CmdletBinding()] | |
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$LogName, [Parameter(Mandatory=$true)][string]$ScriptVersion) | |
Process{ | |
$sFullPath = $LogPath + "\" + $LogName | |
#Check if file exists and delete if it does | |
If((Test-Path -Path $sFullPath)){ | |
Remove-Item -Path $sFullPath -Force | |
} | |
#Create file and start logging | |
New-Item -Path $LogPath -Value $LogName -ItemType File | |
Add-Content -Path $sFullPath -Value "***************************************************************************************************" | |
Add-Content -Path $sFullPath -Value "Started processing at [$([DateTime]::Now)]." | |
Add-Content -Path $sFullPath -Value "***************************************************************************************************" | |
Add-Content -Path $sFullPath -Value "" | |
Add-Content -Path $sFullPath -Value "Running script version [$ScriptVersion]." | |
Add-Content -Path $sFullPath -Value "" | |
Add-Content -Path $sFullPath -Value "***************************************************************************************************" | |
Add-Content -Path $sFullPath -Value "" | |
#Write to screen for debug mode | |
Write-Debug "***************************************************************************************************" | |
Write-Debug "Started processing at [$([DateTime]::Now)]." | |
Write-Debug "***************************************************************************************************" | |
Write-Debug "" | |
Write-Debug "Running script version [$ScriptVersion]." | |
Write-Debug "" | |
Write-Debug "***************************************************************************************************" | |
Write-Debug "" | |
} | |
} | |
Function Log-Write{ | |
<# | |
.SYNOPSIS | |
Writes to a log file | |
.DESCRIPTION | |
Appends a new line to the end of the specified log file | |
.PARAMETER LogPath | |
Mandatory. Full path of the log file you want to write to. Example: C:\Windows\Temp\Test_Script.log | |
.PARAMETER LineValue | |
Mandatory. The string that you want to write to the log | |
.INPUTS | |
Parameters above | |
.OUTPUTS | |
None | |
.NOTES | |
Version: 1.0 | |
Author: Luca Sturlese | |
Creation Date: 10/05/12 | |
Purpose/Change: Initial function development | |
Version: 1.1 | |
Author: Luca Sturlese | |
Creation Date: 19/05/12 | |
Purpose/Change: Added debug mode support | |
.EXAMPLE | |
Log-Write -LogPath "C:\Windows\Temp\Test_Script.log" -LineValue "This is a new line which I am appending to the end of the log file." | |
#> | |
[CmdletBinding()] | |
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$LineValue) | |
Process{ | |
Add-Content -Path $LogPath -Value $LineValue | |
#Write to screen for debug mode | |
Write-Debug $LineValue | |
} | |
} | |
Function Log-Error{ | |
<# | |
.SYNOPSIS | |
Writes an error to a log file | |
.DESCRIPTION | |
Writes the passed error to a new line at the end of the specified log file | |
.PARAMETER LogPath | |
Mandatory. Full path of the log file you want to write to. Example: C:\Windows\Temp\Test_Script.log | |
.PARAMETER ErrorDesc | |
Mandatory. The description of the error you want to pass (use $_.Exception) | |
.PARAMETER ExitGracefully | |
Mandatory. Boolean. If set to True, runs Log-Finish and then exits script | |
.INPUTS | |
Parameters above | |
.OUTPUTS | |
None | |
.NOTES | |
Version: 1.0 | |
Author: Luca Sturlese | |
Creation Date: 10/05/12 | |
Purpose/Change: Initial function development | |
Version: 1.1 | |
Author: Luca Sturlese | |
Creation Date: 19/05/12 | |
Purpose/Change: Added debug mode support. Added -ExitGracefully parameter functionality | |
.EXAMPLE | |
Log-Error -LogPath "C:\Windows\Temp\Test_Script.log" -ErrorDesc $_.Exception -ExitGracefully $True | |
#> | |
[CmdletBinding()] | |
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$ErrorDesc, [Parameter(Mandatory=$true)][boolean]$ExitGracefully) | |
Process{ | |
Add-Content -Path $LogPath -Value "Error: An error has occurred [$ErrorDesc]." | |
#Write to screen for debug mode | |
Write-Debug "Error: An error has occurred [$ErrorDesc]." | |
#If $ExitGracefully = True then run Log-Finish and exit script | |
If ($ExitGracefully -eq $True){ | |
Log-Finish -LogPath $LogPath | |
Break | |
} | |
} | |
} | |
Function Log-Finish{ | |
<# | |
.SYNOPSIS | |
Write closing logging data & exit | |
.DESCRIPTION | |
Writes finishing logging data to specified log and then exits the calling script | |
.PARAMETER LogPath | |
Mandatory. Full path of the log file you want to write finishing data to. Example: C:\Windows\Temp\Test_Script.log | |
.PARAMETER NoExit | |
Optional. If this is set to True, then the function will not exit the calling script, so that further execution can occur | |
.INPUTS | |
Parameters above | |
.OUTPUTS | |
None | |
.NOTES | |
Version: 1.0 | |
Author: Luca Sturlese | |
Creation Date: 10/05/12 | |
Purpose/Change: Initial function development | |
Version: 1.1 | |
Author: Luca Sturlese | |
Creation Date: 19/05/12 | |
Purpose/Change: Added debug mode support | |
Version: 1.2 | |
Author: Luca Sturlese | |
Creation Date: 01/08/12 | |
Purpose/Change: Added option to not exit calling script if required (via optional parameter) | |
.EXAMPLE | |
Log-Finish -LogPath "C:\Windows\Temp\Test_Script.log" | |
.EXAMPLE | |
Log-Finish -LogPath "C:\Windows\Temp\Test_Script.log" -NoExit $True | |
#> | |
[CmdletBinding()] | |
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$false)][string]$NoExit) | |
Process{ | |
Add-Content -Path $LogPath -Value "" | |
Add-Content -Path $LogPath -Value "***************************************************************************************************" | |
Add-Content -Path $LogPath -Value "Finished processing at [$([DateTime]::Now)]." | |
Add-Content -Path $LogPath -Value "***************************************************************************************************" | |
#Write to screen for debug mode | |
Write-Debug "" | |
Write-Debug "***************************************************************************************************" | |
Write-Debug "Finished processing at [$([DateTime]::Now)]." | |
Write-Debug "***************************************************************************************************" | |
#Exit calling script if NoExit has not been specified or is set to False | |
If(!($NoExit) -or ($NoExit -eq $False)){ | |
Exit | |
} | |
} | |
} | |
Function Log-Email{ | |
<# | |
.SYNOPSIS | |
Emails log file to list of recipients | |
.DESCRIPTION | |
Emails the contents of the specified log file to a list of recipients | |
.PARAMETER LogPath | |
Mandatory. Full path of the log file you want to email. Example: C:\Windows\Temp\Test_Script.log | |
.PARAMETER EmailFrom | |
Mandatory. The email addresses of who you want to send the email from. Example: "[email protected]" | |
.PARAMETER EmailTo | |
Mandatory. The email addresses of where to send the email to. Seperate multiple emails by ",". Example: "[email protected], [email protected]" | |
.PARAMETER EmailSubject | |
Mandatory. The subject of the email you want to send. Example: "Cool Script - [" + (Get-Date).ToShortDateString() + "]" | |
.INPUTS | |
Parameters above | |
.OUTPUTS | |
Email sent to the list of addresses specified | |
.NOTES | |
Version: 1.0 | |
Author: Luca Sturlese | |
Creation Date: 05.10.12 | |
Purpose/Change: Initial function development | |
.EXAMPLE | |
Log-Email -LogPath "C:\Windows\Temp\Test_Script.log" -EmailFrom "[email protected]" -EmailTo "[email protected], [email protected]" -EmailSubject "Cool Script - [" + (Get-Date).ToShortDateString() + "]" | |
#> | |
[CmdletBinding()] | |
Param ([Parameter(Mandatory=$true)][string]$LogPath, [Parameter(Mandatory=$true)][string]$EmailFrom, [Parameter(Mandatory=$true)][string]$EmailTo, [Parameter(Mandatory=$true)][string]$EmailSubject) | |
Process{ | |
Try{ | |
$sBody = (Get-Content $LogPath | out-string) | |
#Create SMTP object and send email | |
$sSmtpServer = "smtp.yourserver" | |
$oSmtp = new-object Net.Mail.SmtpClient($sSmtpServer) | |
$oSmtp.Send($EmailFrom, $EmailTo, $EmailSubject, $sBody) | |
Exit 0 | |
} | |
Catch{ | |
Exit 1 | |
} | |
} | |
} |
As @elfim mentioned in the earlier comment, Line 53 still needs to be fixed. The value for line 53 is still New-Item -Path $LogPath -Value $LogName –ItemType File and it should be New-Item -Path $LogPath -Name $LogName –ItemType File
Thanks to @elfim and @animetauren .. for identifying that typo
For those who are new to PowerShell .. you can simply reference you functions.ps1 in your script and then use it as normal.
$directorypath = Split-Path $MyInvocation.MyCommand.Path
$incFunctions = $directorypath + "\Logging_Functions.ps1"
logfile = $directorypath + "\myoutput.log"
use the . syntax to include the functions file
. $incFunctions
Log-Write -LogPath $logfile -LineValue "Why is everyone obsessed with hybrid! "
As a note, when exiting due to failure, a nonzero exit code should be issued.
How would I invoke the Log-write function with a Copy-item command?
I'm getting a diferent error:
New-Item : The Access to the path 'C: \ scripts \ compacta_sql \ logs ' was denied.
No C:\scripts\functions\Logging_Functions.ps1:45 caractere:5
-
New-Item -Path $LogPath -Value $LogName -ItemType File
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : PermissionDenied: (C:\scripts\compacta_sql\logs:String) [New-Item], UnauthorizedAccessException
- FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand
Hello,
Add-Content -Path $sFullPath -Value "***************************************************************************************************"
why am not able to write content to file again..its not giving any error and not writing content to file/
?
It'd be much better if a function to perform log rotation is included here
Thank you for this. I appreciate you sharing your work. Some suggestions for improvement:
-
When adding a bunch of lines at once, such as in
Log-Start
, consider using a Dot Net's StringBuilder:
$sb = [System.Text.StringBuilder]::new()
$sb.AppendLine(...)
$text = $sb.ToString()
Add-Content -Path $LogPath -Value $text'
Write-Debug $text`Then you can emit the same text in two places without having to repeat yourself.
-
Consider using
Join-Path
when concatenating strings to form a path. It saves all the trouble with where to put what kind of separator
Just some ideas. Thanks again!
Line 53 is incorrect. Instead of this line: New-Item -Path $LogPath -Value $LogName –ItemType File
it should be this one: New-Item -Path $LogPath -Name $LogName –ItemType File
and
Line 174 there is a typo: Break is correct
Apart from these little things - your script is great! Thanks a lot Luca!