PoshCode Logo PowerShell Code Repository

Write-Log by Andy Arismendi 3 years ago (modification of post by Andy Arismendi view diff)
View followups from Will Steele and blabla | diff | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/2575"></script>download | new post

Logging function for Powershell v2. Needed to address current Powershell logging limitations. See a discussion about said limitations here: http://jdhitsolutions.com/blog/2011/03/powershell-automatic-logging/#comment-2899 .

Logs to file and prints messages to the console and optionally logs to the system event logs. Note – admin rights are required when specifying the EventLogName parameter because the SourceExists method requires admin rights because it checks rights on the Security log. This limitation seems silly to me and if you think so as well get Microsoft to fix it by voting here: https://connect.microsoft.com/VisualStudio/feedback/details/293617/eventlog-sourceexists-always-fails-for-non-administrators#tabs .

Feel free to add features as necessary.

  1. function Write-Log {
  2.  
  3.         #region Parameters
  4.        
  5.                 [cmdletbinding()]
  6.                 Param(
  7.                         [Parameter(ValueFromPipeline=$true,Mandatory=$true)] [ValidateNotNullOrEmpty()]
  8.                         [string] $Message,
  9.  
  10.                         [Parameter()] [ValidateSet(“Error”, “Warn”, “Info”)]
  11.                         [string] $Level = “Info”,
  12.                        
  13.                         [Parameter()]
  14.                         [Switch] $NoConsoleOut,
  15.                        
  16.                         [Parameter()]
  17.                         [String] $ConsoleForeground = 'White',
  18.                        
  19.                         [Parameter()] [ValidateRange(1,30)]
  20.                         [Int16] $Indent = 0,
  21.  
  22.                         [Parameter()]
  23.                         [IO.FileInfo] $Path =$env:temp\PowerShellLog.txt”,
  24.                        
  25.                         [Parameter()]
  26.                         [Switch] $Clobber,
  27.                        
  28.                         [Parameter()]
  29.                         [String] $EventLogName,
  30.                        
  31.                         [Parameter()]
  32.                         [String] $EventSource,
  33.                        
  34.                         [Parameter()]
  35.                         [Int32] $EventID = 1
  36.                        
  37.                 )
  38.                
  39.         #endregion
  40.  
  41.         Begin {}
  42.  
  43.         Process {
  44.                 try {                  
  45.                         $msg = '{0}{1} : {2} : {3}' -f (" " * $Indent), (Get-Date -Format “yyyy-MM-dd HH:mm:ss”), $Level.ToUpper(), $Message
  46.                        
  47.                         if ($NoConsoleOut -eq $false) {
  48.                                 switch ($Level) {
  49.                                         'Error' { Write-Error $Message }
  50.                                         'Warn' { Write-Warning $Message }
  51.                                         'Info' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor $ConsoleForeground}
  52.                                 }
  53.                         }
  54.  
  55.                         if ($Clobber) {
  56.                                 $msg | Out-File -FilePath $Path -Force
  57.                         } else {
  58.                                 $msg | Out-File -FilePath $Path -Append
  59.                         }
  60.                        
  61.                         if ($EventLogName) {
  62.                        
  63.                                 if (-not $EventSource) {
  64.                                         $EventSource = ([IO.FileInfo] $MyInvocation.ScriptName).Name
  65.                                 }
  66.                        
  67.                                 if(-not [Diagnostics.EventLog]::SourceExists($EventSource)) {
  68.                                         [Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
  69.                         }
  70.  
  71.                                 $log = New-Object System.Diagnostics.EventLog  
  72.                             $log.set_log($EventLogName)  
  73.                             $log.set_source($EventSource)
  74.                                
  75.                                 switch ($Level) {
  76.                                         “Error” { $log.WriteEntry($Message, 'Error', $EventID) }
  77.                                         “Warn”  { $log.WriteEntry($Message, 'Warning', $EventID) }
  78.                                         “Info”  { $log.WriteEntry($Message, 'Information', $EventID) }
  79.                                 }
  80.                         }
  81.  
  82.                 } catch {
  83.                         throw “Failed to create log entry in: ‘$Path’. The error was: ‘$_’.”
  84.                 }
  85.         }
  86.  
  87.         End {}
  88.  
  89.         <#
  90.                 .SYNOPSIS
  91.                         Writes logging information to screen and log file simultaneously.
  92.  
  93.                 .DESCRIPTION
  94.                         Writes logging information to screen and log file simultaneously. Supports multiple log levels.
  95.  
  96.                 .PARAMETER Message
  97.                         The message to be logged.
  98.  
  99.                 .PARAMETER Level
  100.                         The type of message to be logged.
  101.                        
  102.                 .PARAMETER NoConsoleOut
  103.                         Specifies to not display the message to the console.
  104.                        
  105.                 .PARAMETER ConsoleForeground
  106.                         Specifies what color the text should be be displayed on the console. Ignored when switch 'NoConsoleOut' is specified.
  107.                
  108.                 .PARAMETER Indent
  109.                         The number of spaces to indent the line in the log file.
  110.  
  111.                 .PARAMETER Path
  112.                         The log file path.
  113.                
  114.                 .PARAMETER Clobber
  115.                         Existing log file is deleted when this is specified.
  116.                
  117.                 .PARAMETER EventLogName
  118.                         The name of the system event log, e.g. 'Application'.
  119.                
  120.                 .PARAMETER EventSource
  121.                         The name to appear as the source attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
  122.                
  123.                 .PARAMETER EventID
  124.                         The ID to appear as the event ID attribute for the system event log entry. This is ignored unless 'EventLogName' is specified.
  125.  
  126.                 .EXAMPLE
  127.                         PS C:\> Write-Log -Message "It's all good!" -Path C:\MyLog.log -Clobber -EventLogName 'Application'
  128.  
  129.                 .EXAMPLE
  130.                         PS C:\> Write-Log -Message "Oops, not so good!" -Level Error -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "My Script"
  131.  
  132.                 .INPUTS
  133.                         System.String
  134.  
  135.                 .OUTPUTS
  136.                         No output.
  137.                        
  138.                 .NOTES
  139.                         Revision History:
  140.                                 2011-03-10 : Andy Arismendi - Created.
  141.         #>
  142. }

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me