# Tuesday, August 18, 2009

One thing that has been lamented frequently about PowerShell is that it is very difficult to log, if not impossible, to log all of the various types of streams it has to a single source. The legacy Windows shell CMD, and Unix shells like Bash, Ksh etc only deal with three streams: stdin, stdout and stderr for Input, Ouput and Error respectively. PowerShell has many more: Input, Output, Verbose, Warning, Debug, Progress and Error. Finally, the APIs in v2.0 offer enough hooks to unify the logging but you got to work a bit to make it come together. Well, to be honest, you got me doing the work. The rest is easy ;)

import-module .\scriptlogger.psm1 -force

$logger = New-ScriptLogger

# override error handler
$logger.ErrorHandler = {
    param($record)
    
    $record.tostring() >> scriptlog.txt
}

# override verbose handler
$logger.VerboseHandler = {
    param($record)
    
    $record.message >> scriptlog.txt
}

# run scriptblock with logging
$logger.Invoke(
    {
        $verbosepreference='continue';
        $erroractionpreference = 'continue';
        $debugpreference = 'continue';
        write-verbose "verbose";
        write-error "an error";
        write-warning "a warning"
        Write-debug "debug string"
        "this is output"
        1,2,3
    })
And here is the module; save it as ScriptLogger.psm1. By default, all logging goes to an attached debugger, like sysinternals DbgView. You can override any of the handlers like above and do what you want. Each handler receives one argument: a ErrorRecord, WarningRecord, VerboseRecord, DebugRecord or ProgressRecord. All of these Types are native powershell types and are documented on MSDN.
<#
    Name     : Universal Script Logging Module (ScriptLogger.psm1)
    Version  : 0.1
    Author   : Oisin Grehan (MVP)
    Site     : http://www.nivot.org/
#>
function New-ScriptLogger {
    New-Module -AsCustomObject -ScriptBlock {
        
        $script:ps              = [powershell]::Create()
        $script:ar              = $null
        $script:module          = $ExecutionContext.SessionState.Module
        
        [scriptblock]
        $script:ErrorHandler    = {
            param(
                [Management.Automation.ErrorRecord]
                $record
            )
            [diagnostics.debug]::writeline(
                "Error: " + $record.tostring());
        }
        [scriptblock]
        $script:WarningHandler  = {
            param(
                [Management.Automation.WarningRecord]
                $record
            )        
            [diagnostics.debug]::writeline(
                "Warning: " + $record.message);
        }
        [scriptblock]
        $script:VerboseHandler  = {
            param(
                [Management.Automation.VerboseRecord]
                $record
            )
            [diagnostics.debug]::writeline(
                "Verbose: " + $record.message);
        }
        [scriptblock]
        $script:DebugHandler    = {
            param(
                [Management.Automation.DebugRecord]
                $record
            )
            [diagnostics.debug]::writeline(
                "Debug: " + $record.message);
        }
        [scriptblock]
        $script:ProgressHandler = {
            param(
                [Management.Automation.ProgressRecord]
                $record
            )        
            [diagnostics.debug]::writeline(
                "Progress: " + $record);
        }
        
        $script:Handlers   = @{
            Error = Register-ObjectEvent $ps.Streams.Error DataAdded -Action {
                & $event.MessageData {& $ErrorHandler @args} $event.sender[$eventargs.index]
            } -MessageData $module #-SupportEvent
            
            Warning = Register-ObjectEvent $ps.Streams.Warning DataAdded -Action {
                & $event.MessageData {& $WarningHandler @args} $event.sender[$eventargs.index]
            } -MessageData $module #-SupportEvent
            
            Verbose = Register-ObjectEvent $ps.Streams.Verbose DataAdded -Action {
                & $event.MessageData {& $VerboseHandler @args} $event.sender[$eventargs.index]
            } -MessageData $module #-SupportEvent
            
            Debug = Register-ObjectEvent $ps.Streams.Debug DataAdded -Action {
                & $event.MessageData {& $DebugHandler @args} $event.sender[$eventargs.index]
            } -MessageData $module #-SupportEvent
            
            Progress = Register-ObjectEvent $ps.Streams.Progress DataAdded -Action {
                & $event.MessageData {& $ProgressHandler @args} $event.sender[$eventargs.index]
            } -MessageData $module #-SupportEvent
        }
        
        function Invoke {
            param(
                [validatenotnullorempty()]
                [scriptblock]$script
            )
            
            try {
            
                write-host -foreground green "Running"
                
                $ps.commands.clear()
                $command = new-object management.automation.runspaces.command $script, $true            
                $ps.commands.addcommand($command) > $null                
                $ps.invoke() # returns output                
            
            } catch {
            
                # oops-ee!
                write-host -foreground red "Unhandled terminating error: $_"
                $record = new-object management.automation.errorrecord $(
                    new-object exception $_.tostring()), "TerminatingError", "NotSpecified", $null
                & $ErrorHandler $record
            
            } finally {
            
                write-host -foreground green "Complete"
            
            }
        }
                
        Export-ModuleMember -Function Invoke -Variable ErrorHandler, WarningHandler, VerboseHandler, DebugHandler, ProgressHandler
    }
}

Have fun!

posted on Tuesday, August 18, 2009 10:58:24 PM (Eastern Daylight Time, UTC-04:00)  #    Comments [1] Trackback
Related posts:
PowerShell 2.0 – Partial Application of Functions and Cmdlets
PowerShell – The Patchwork of Paths, PSPaths and ProviderPaths
PowerShell - Why are keys in Hashtables sorted randomly?
PowerShell 2.0 - About Dynamic Parameters
PowerShell 2.0 – Introducing the PModem File Transfer Protocol
PowerShell 2.0 - Enabling Remoting with Virtual XP Mode on Windows 7
Tracked by:
"http://powerscripting.wordpress.com/2010/03/01/episode-103-mvps-brandon-shell-a... [Pingback]

Referred by:
http://www.worio.com/ [Referral]
http://twitturls.com/ [Referral]
http://www.google.com/reader/view/ [Referral]
http://real-url.org/ [Referral]
http://twitter.com/home [Referral]
http://twitter.com/ [Referral]
http://powertwitter.me/ [Referral]
http://storage.conduit.com/4/143/CT1437604/Gadgets/4066044a-... [Referral]
http://msdn.microsoft.com/fr-fr/community/default.aspx [Referral]
app:/index.html [Referral]
http://twur.li/ [Referral]
http://twitter.com/oising [Referral]
http://twitter.com/getpowershell [Referral]
http://mail.google.com/mail/?ui=2&view=bsp&ver=1qygpcgurkovy [Referral]
http://halr9000.com/ [Referral]
powershell (blogsearch.google.com) [Referral]
powershell (www.bing.com) [Referral]
http://www.vinden.nl/?&vid=l82168224171I1247937235&refer=ope... [Referral]
http://www.google.nl/ig?t=1 [Referral]
http://iconfactory.com/twitterrific [Referral]
http://www.google.com.au/reader/view/?tab=my [Referral]
powershell script .ps (www.google.ca) [Referral]
http://www.twittergadget.com/gadget.asp?lang=en&country=us&.... [Referral]
http://www.google.com/reader/view/?tab=my [Referral]
http://feeds.feedburner.com/halr9000 [Referral]
http://delicious.com/halr9000/powerscripting+todo [Referral]
http://docs.google.com/a/powerscripting.net/Doc?docid=0AXCyx... [Referral]
http://docs.google.com/a/powerscripting.net/Doc?id=dgxpvkr_3... [Referral]
http://www.bloglines.com/myblogs_display?sub=77725598&site=2... [Referral]
http://www.google.co.uk/reader/view/ [Referral]
http://pipes.yahoo.com/pipes/pipe.info?_id=uAmYy9xq3BGHcV361... [Referral]
powershell register-objectevent write-progress (www.google.com) [Referral]
http://www.google.co.jp/reader/view/?tab=my [Referral]
http://www.google.de/reader/view/?tab=my [Referral]
powershell 2.0 module (search.conduit.com) [Referral]
http://www.google.com/ig?t=0&refresh=1 [Referral]
http://twitter.com/halr9000 [Referral]
http://powerscripting.wordpress.com/ [Referral]
Powershell 2.0 bash 2009 (www.google.com) [Referral]
powershell (www.google.se) [Referral]
PowerShell "V2 0" (www.google.ch) [Referral]
flexible scripts for windows powershell (www.google.com) [Referral]
http://www.google.com/reader/view/?hl=en&tab=wy [Referral]
powershell $args (blogsearch.google.com) [Referral]
powershell logger (www.google.com) [Referral]
scripted diagnostics native host (www.google.com) [Referral]
powershell verbose logging (www.google.com) [Referral]
http://powerscripting.libsyn.com/index.php?post_id=518733# [Referral]
powershell warning action (www.google.com) [Referral]
New-ScriptLogger (www.google.com) [Referral]
powershell stdin stdout (www.google.com.au) [Referral]
powershell logging (www.google.com) [Referral]
powershell progress (www.google.nl) [Referral]
http://get-powershell.com/ [Referral]
powershell script (www.google.be) [Referral]
"powershell 2.0" wpf (www.google.com) [Referral]
powershell stdin (www.google.nl) [Referral]
"write-progress" capture (www.google.is) [Referral]
powershell write log verbose (www.google.at) [Referral]
Powershell log verbose (www.google.co.uk) [Referral]
powershell logging (www.google.co.uk) [Referral]
powershell debug logging (www.google.com) [Referral]
powershell 2.0 scripts (www.google.com) [Referral]
http://groups.google.com/group/microsoft.public.windows.powe... [Referral]
powershell log verbose (www.google.com) [Referral]
http://www.vistax64.com/powershell/246946-stderr-external-pr... [Referral]
scripted diagnostics native host (www.bing.com) [Referral]
http://www.outertech.com/ [Referral]
1 (www.microsoft.com) [Referral]
powershell log verbose (www.google.ca) [Referral]
powershell 2.0 script logging (www.google.com) [Referral]
powershell write log (www.google.de) [Referral]
powershell write log (www.google.com) [Referral]
google script block referrals sites (www.google.com.au) [Referral]
powershell sharepoint log (www.google.be) [Referral]
powershell logger (www.google.com) [Referral]
powershell logger (www.google.com) [Referral]
powershell Register-ObjectEvent (www.google.com) [Referral]
debugging for warning diagnostics (search.yahoo.com) [Referral]
powershell 2.0 (www.google.com) [Referral]
3 (www.microsoft.com) [Referral]
http://blog.usepowershell.com/ [Referral]
runspaces.command power shell (www.google.com) [Referral]
http://www.netvibes.com/ [Referral]
powershell script ps (www.google.com) [Referral]
http://groups.google.com/group/microsoft.public.windows.powe... [Referral]
http://www.google.com/ig?t=0&refresh=1 (www.google.com) [Referral]
Logging powershell (www.google.se) [Referral]
http://groups.google.com/group/microsoft.public.windows.powe... [Referral]
iconfactory.com/referral (www.google.com) [Referral]
powershell stdin (www.google.co.kr) [Referral]
powershell 2.0 script name (www.google.it) [Referral]
powershell 2.0 modules (www.google.at) [Referral]
powershell "-verbose" save output (www.google.es) [Referral]
powershell Management Object .tostring (www.google.com) [Referral]
powershell log events verbose (www.google.nl) [Referral]
script automation with powershell (www.google.com) [Referral]
http://www.google.com/reader/view/feed/http%3A//www.nivot.or... [Referral]
poweshell script logging errors (www.google.com) [Referral]
powershell v2 logging (www.google.co.uk) [Referral]
debugging for warning diagnostics (www.google.com.ph) [Referral]
delicious.com / referral (www.google.com.tr) [Referral]
scripted diagnostic native host (www.bing.com) [Referral]
script powershell error management (www.google.ca) [Referral]
1 (www.microsoft.com) [Referral]
powershell script module psm1 help (www.google.cz) [Referral]
1 (www.microsoft.com) [Referral]
"scripted diagnostics native host" (www.google.com) [Referral]
http://www.twitscoop.com/ [Referral]
http://twitter.com/dustinvenegas/statuses/4534736897 [Referral]
powershell script logging debug view (www.google.com) [Referral]
powershell "Write-debug" "write-error" (www.google.com) [Referral]
http://my.yahoo.com/ [Referral]
wwf powershell (www.google.com) [Referral]
psm1 $args (www.google.cz) [Referral]
powershell write log for script (www.google.com) [Referral]
Management.Automation.Debugger (www.google.dk) [Referral]
powershell verbose write (www.google.de) [Referral]
"new-module" powershell (www.google.de) [Referral]
"new-module" powershell (www.google.de) [Referral]
powershell 2.0 script group members (www.google.com) [Referral]
override verbose handler in powershell (www.google.com) [Referral]
http://powershellcommunity.org/blogs/externalblogs.aspx [Referral]
wwf powershell (www.google.co.uk) [Referral]
iconfactory.com referral (www.google.com) [Referral]
powershell logging (www.bing.com) [Referral]
1 (www.microsoft.com) [Referral]
http://groups.google.com/group/microsoft.public.windows.powe... [Referral]
+script +logger (www.google.com.br) [Referral]
powershell and stderr\ (www.bing.com) [Referral]
powershell Verbose (www.bing.com) [Referral]
powershell 2.0 logging (www.google.com) [Referral]
http://powershellcommunity.org/Blogs/ExternalBlogs.aspx [Referral]
powershell warning verbose errors log site:nivot.org (www.bing.com) [Referral]
powershell [Management.Automation.ProgressRecord] (www.google.com) [Referral]
Write a Powershell Module (www.google.nl) [Referral]
powershell verbose logging (www.google.com) [Referral]
powershell 2.0 logging (www.google.com) [Referral]
http://www.vi-toolkit.com/wiki/index.php/VI-Toolkit:Communit... [Referral]
"register-objectevent" (www.google.com) [Referral]
http://www.powershellcommunity.org/Blogs/ExternalBlogs/tabid... [Referral]
powershell warning action (www.google.com) [Referral]
powershell v2 logging (www.google.ch) [Referral]
powershell logger (www.google.com) [Referral]
http://www.powershellcommunity.org/Blogs/ExternalBlogs.aspx [Referral]
http://www.ixquick.com/do/metasearch.pl [Referral]
http://www.microsoft.com/communities/newsgroups/list/en-us/d... [Referral]
wwf powershell (www.google.com.jm) [Referral]
powershell warning handler (www.google.com) [Referral]
http://storage.conduit.com (www.google.es) [Referral]
powershell Register-ObjectEvent (www.google.com) [Referral]
powershell errorhandler (www.google.ru) [Referral]
powershell stderr (www.google.com) [Referral]
powershell stdin (www.google.ca) [Referral]
������ (www.google.com) [Referral]
PowerShell save new-module (www.google.com) [Referral]
powershell create Script Block (www.google.ch) [Referral]
warning action powershell (www.google.com) [Referral]
powershell log verbose (www.google.com) [Referral]
"scripted diagnostic native host" what does it do (www.google.com) [Referral]
powershell script record (www.google.com) [Referral]
sender eventargs powershell -asp.net (www.google.com.au) [Referral]
powershell write log (www.google.pt) [Referral]
PowerShell 2.0 Script Blocks (www.google.com) [Referral]
powershell "invoke variable" (www.google.com) [Referral]
powershell verbose logging (www.google.co.uk) [Referral]
PowerShell debug logging (www.google.co.za) [Referral]
1 (www.microsoft.com) [Referral]
"scripted diagnostics native host" (www.google.com) [Referral]
power shell stdin (www.google.com) [Referral]
powershell logger (www.google.co.uk) [Referral]
powershell verbose logging (www.google.com) [Referral]
verbose logging powershell (www.google.com) [Referral]
powershell stdin (www.google.com) [Referral]
powershell logger (www.google.com) [Referral]
powershell 2.0 log on script example (www.google.co.uk) [Referral]
powershell Register-ObjectEvent write-progress (www.google.com) [Referral]
debug log powershell (www.google.com) [Referral]
wcf powershell 2.0 automation (www.google.com) [Referral]
wcf powershell 2.0 automation (www.google.com) [Referral]
powershell warning action (www.google.com) [Referral]
http://www.microsoft.com/communities/newsgroups/list/en-us/d... [Referral]
Scripted Diagnostics Native Host (www.bing.com) [Referral]
powershell 2.0 logging (www.google.com) [Referral]
powershell logging module (www.google.com) [Referral]
DebugView PowerShell (www.google.com) [Referral]
debug view & Powershell script (www.google.co.cr) [Referral]
scripted diagnostics native host (www.bing.com) [Referral]
diagnostic native host (www.google.ca) [Referral]
"scripted diagnostic native host" (www.google.com) [Referral]
subst commandpowershell (www.google.fi) [Referral]
powershell wwf (www.google.com.jm) [Referral]
logger for powershell (www.bing.com) [Referral]
powershell Debug..::.WriteLine (www.google.co.uk) [Referral]
powershell 2.0+Write-Debug (www.google.com) [Referral]
powershell module sessionstate executioncontext (www.google.com) [Referral]
www.google.co.uk./ig?t=0&refresh=1 (www.google.co.uk) [Referral]
record all output from powershell script (www.bing.com) [Referral]
@shell.com.ph (search.yahoo.com) [Referral]
powershell 2.0 wcf (www.google.com) [Referral]
powershell debugview (www.google.co.uk) [Referral]
Scripted Diagnostics Native Host (www.google.co.uk) [Referral]
scripted diagnostics native host (www.google.ie) [Referral]
scripted diagnostics native host (www.google.de) [Referral]
powershell module logs (www.google.com) [Referral]
label:powershell (www.google.com) [Referral]
DebugRecord powershell (www.bing.com) [Referral]
@shell.com.au (search.yahoo.com) [Referral]
powershell verbose log (www.google.com.au) [Referral]
windows 7 scripted diagnostics native host (www.google.com) [Referral]
powershell to debug view (www.google.co.uk) [Referral]
Scripted Diagnostics Native Host (www.google.co.uk) [Referral]
powershell verbose logging (www.google.com) [Referral]
running powershell script and logging (www.google.com.pk) [Referral]
powerShell 2.0 Logging (www.google.com) [Referral]
powershell WarningRecord (www.google.co.jp) [Referral]
powershell invoking the debugger (www.google.com) [Referral]
powershell script debug log (www.google.com) [Referral]
powershell verbose logging (www.google.com) [Referral]
powershell verbose logging (www.google.com) [Referral]
http://groups.google.it/group/nl-ig?hl=it (www.google.it) [Referral]
Scripted Diagnostics Native Host (www.google.com) [Referral]
asp.net vi-toolkit powershell runspace (www.google.com) [Referral]
runspace asp.net vi-toolkit (www.google.com) [Referral]
scripted diagnostics native host (www.google.com) [Referral]
powershell error warning (www.bing.com) [Referral]
http://www.google.nl/ig?t=0&refresh=1 (www.google.com) [Referral]
powershell script verbose (www.google.com) [Referral]
scripted diagnostics native host (www.google.ca) [Referral]
powershell view stderr (www.google.com) [Referral]
diagnostic native host (www.google.ca) [Referral]
powershell writelog (www.google.nl) [Referral]
que significa estorage.conduit.com (www.google.com.gt) [Referral]
logon script powershell 2.0 (www.bing.com) [Referral]
nivot script loger (www.google.cz) [Referral]
powershell logging (www.bing.com) [Referral]
powershell logger (www.bing.com) [Referral]
scripted diagnostic native host (www.google.com) [Referral]
powershell ProgressRecord (www.google.de) [Referral]
logging powershell scripts (www.bing.com) [Referral]
http://www.vistax64.com/powershell/267369-changes-stdout-std... [Referral]
powershell logging module (www.bing.com) [Referral]
www.nivot.org/2009/08/19/PowerShell20AConfigurableAndFlexibleScriptLoggerModule.aspx (www.google.com) [Referral]
scripted diagnostics native host (www.google.com) [Referral]
powershell 2.0 eventing register-objectevent (www.google.com) [Referral]
http://social.technet.microsoft.com/Forums/en-US/winserverpo... [Referral]
scripted diagnostics native host (www.bing.com) [Referral]
1 (www.microsoft.com) [Referral]
Scripted+Diagnostics+Native+Host (www.google.com.tr) [Referral]
New-Module AsCustomObject ScriptBlock (www.google.se) [Referral]
record file system event powershell 2.0 (www.google.com) [Referral]
1 (www.microsoft.com) [Referral]
windows 7 script native host diagnostic error (www.google.com) [Referral]
scripted diagnostics native host (www.bing.com) [Referral]
"scripted diagnostics native host" (www.bing.com) [Referral]
powershell 2.0 subst (www.google.com) [Referral]
powershell debug.writeline (www.google.de) [Referral]
powershell log output capture diagnostic (www.google.com.au) [Referral]
powershell stdin (www.google.cz) [Referral]
http://www.microsoft.com/communities/newsgroups/en-us/defaul... [Referral]
http://www.baidu.com/s?bs=powershell+sub&f=8&wd=powershell+a... [Referral]
powershell debugview write-debug (www.google.com) [Referral]
powershell debugview (www.google.com) [Referral]
powershell verbose logging (www.google.com) [Referral]
powershell wwf (www.google.nl) [Referral]
errorhandler powershell (www.google.nl) [Referral]
powershell capture "write-progress" (www.google.com) [Referral]
powershell logging (www.bing.com) [Referral]
getpowershell invoke streams (www.google.com) [Referral]
pwershell script recording (www.google.fr) [Referral]
scripted diagnostics native host (www.google.com) [Referral]
powershell logger module (www.google.com) [Referral]
powershell stdin (www.google.com) [Referral]
powershell function ErrorHandler() (www.google.com) [Referral]
ravi pmodem (www.google.com) [Referral]
http://www.ustream.tv/channel/powerscripting-podcast [Referral]
logging module nivot (www.google.com) [Referral]
http://www.ustream.tv/channel-room/274919 [Referral]
http://cdn1.ustream.tv/swf/4/irc.79.swf [Referral]
wpf run record script (www.google.com) [Referral]
script logging powershell (www.bing.com) [Referral]
http://www.nivot.org/2009/08/19/PowerShell20AConfigurableAndFlexibleScriptLoggerModule.aspx (www.google.com) [Referral]
powershell verbose logging (www.google.com) [Referral]
powershell logger (www.google.com) [Referral]
powershell capture stderr (www.google.com) [Referral]
DebugHandler in powershell (www.google.co.in) [Referral]
powershell register-objectevent stdout stderr (www.google.no) [Referral]
@shell.com.br (search.yahoo.com) [Referral]
register-objectevent messagedata (www.google.com) [Referral]
1 (65.55.21.250) [Referral]
logging errors in powershell script (www.bing.com) [Referral]
powershell logging module (www.google.com) [Referral]
powershell 2.0 stdin (www.google.com) [Referral]
http://stackoverflow.com/questions/2424963/in-powershell-how... [Referral]
powershell configurable script (www.google.be) [Referral]
Tuesday, September 29, 2009 1:23:06 AM (Eastern Daylight Time, UTC-04:00)
How are you. Be careful that victories do not carry the seed of future defeats.
I am from Ireland and bad know English, give true I wrote the following sentence: "Binary inbox and pollution records shall be released and shown sequential to israel."

With best wishes :), Ravi.
Comments are closed.