If you’ve read this post, and perhaps the ones before it, then you know that my advanced function templates have always used Write-Verbose statements for logging purposes. Anytime you want to log something using my template, it’s using Write-Verbose whether you know it or not. There’s multiple places you can log, and it’s all based on the value of the Log parameter (in 2.0 and greater). As of the 2.x versions, you can use … -Log ToScreen, … -Log ToScreenAndFile, and … -Log ToFile. Again, regardless of which way you choose to log, it’s Write-Verbose that’s doing the work. Okay fine, it’s really Out-File if you’re writing to a file, although my nested function is still called Write-Verbose. That said, there actually was a time when it was all Write-Verbose, even when writing to a file.
So, I’ve always had a specific way to write my logging statements. There’s no agreed upon best practice for Write-Verbose statements, but for me there is, and that’s why I’m writing again today. Maybe it’ll make sense to use this model for yourself, as well.
In the instance where something is about to happen (think, happens right after the current logging statement ends), I strive to use an “ing” word. From what I remember about my grade school years, I remember this as a present progressive. Here’s a few examples.
Write-Verbose -Message "$BlockLocation Setting required variables." Write-Verbose -Message "$BlockLocation Checking if the current time zone is $DesiredTimeZone." Write-Verbose -Message "$BlockLocation Collecting Forest FSMO Roles." Write-Verbose -Message "$BlockLocation Displaying all FSMO Roles." Write-Verbose -Message "$BlockLocation Downloading $Application installer from S3." Write-Verbose -Message "$BlockLocation Installing $Application silently." Write-Verbose -Message "$BlockLocation Invoking user is ""$env:USERDOMAIN\$env:USERNAME"" on the ""$env:COMPUTERNAME"" computer."
In my experience I tent to use an “ing” words about 80 – 90% of the time. There is, however, one other verb form I find myself using, and that’s the past tense verb form. Sometimes, it makes sense to indicate that something has completed even when a new logging, “ing” statement would indicated the previous logging topic had ended. Here’s a few examples from some of my functions.
Write-Verbose -Message "$BlockLocation Determined the time zone is not correctly set for $DesiredTimeZone." Write-Verbose -Message "$BlockLocation Unhandled exception ($($Error[0].Exception.GetType().FullName))." Write-Verbose -Message "Connected to Exchange Server: $ExchServ."
While looking for other worthy examples, I did find a few Write-Verbose statements that didn’t include either an “ing,” or “ed” verb. These are very rare for me, but they have been included at times to indicate information to whomever is reading the logging statements.
Notice, however, that they come just before a statement that uses “ing.” They probably shouldn’t be there, and wouldn’t be there if I was writing that tool today. Then again, they might be, as now that I think about it, and look over this older code, the logging differed because of its audience. In this case, having indicated the key and value already existed, did not exist, or did exist and needed correction, was important enough to convey. So much so, the “ing” word didn’t feel as though it was enough.
#region Create Registy Key(s) and add value (if necessary). If (-Not($Exists)) { Write-Verbose -Message "$BlockLocation Registry key and value do not yet exist." Write-Verbose -Message "$BlockLocation Creating new Registry key and value." [System.Void](New-Item $RegKey -Force | New-ItemProperty -Name $RegName -Value $RegValue -Force) $CheckChange = $true $FixType = 'changed' } ElseIf ((Get-ItemProperty -Path $RegKey -Name $RegName -ErrorAction SilentlyContinue).$RegName -ne $RegValue) { Write-Verbose -Message "$BlockLocation Registry key and value already exist, but the value is not correct." Write-Verbose -Message "$BlockLocation Correcting the Registry value." [System.Void](New-Item $RegKey -Force | New-ItemProperty -Name $RegName -Value $RegValue -Force) $CheckChange = $true $FixType = 'corrected' } Else { Write-Verbose -Message "$BlockLocation Registry key and value already exist, and the value is correct." } #endregion
So, there’s that: My Write-Verbose best practice. While it wasn’t a stupid draft so much, there’s one less in the drafts!