en-US/about_PowerShellLogging.help.txt

TOPIC
    about_PowerShellLogging
 
SHORT DESCRIPTION
    Provides background information about the PowerShellLogging module.
     
LONG DESCRIPTION
    This topic provides information about the PowerShellLogging.IHostIoSubscriber
    interface, the PowerShellLogging.LogFile and PowerShellLogging.ScriptBlockOutputSubscriber
    classes that implement it, and the Windows PowerShell cmdlets used to
    manage objects of these types.
     
  About PowerShellLogging
      The PowerShellLogging module helps to solve the problem of how to capture
      all output host, and tee it to a log file (including Error, Warning,
      Verbose, and Debug streams), without relying on the user who called
      a script to redirect those streams to a log file, and without relying
      on calls to specific cmdlets or functions. An existing PowerShell
      script can achieve full logging by importing this module and executing
      the Enable-LogFile cmdlet.
       
      It accomplishes this by using .NET Reflection to access private members
      of the PowerShell classes. This is a double-edged sword, as any time
      Microsoft releases a new version of PowerShell (or even a patch to the
      existing version), this module's functionality may break and require an
      update. If you prefer not to use this approach, there is a script-based
      module with similar (though less complete) functionality available at
      http://gallery.technet.microsoft.com/scriptcenter/Write-timestamped-output-4ff1565f
     
  PowerShellLogging.HostIoInterceptor and PowerShellLogging.IHostIoSubscriber
      The heart of this module is the HostIoInterceptor class, which is a subclass
      of Microsoft's System.Management.Automation.Host.PSHostUserInterface class
      and acts as a middle man between the InternalHostUserInterface class and its
      externalUI field. Every time the PowerShell host sends text output to the
      console or ISE output window, it does so via calls to the externalUI field.
       
      This module replaces the externalUI field with an instace of the
      HostIoInterceptor object. HostIoInterceptor passes calls on to the original
      externalUI object, and also to any number of objects implementing the
      PowerShellLogging.IHostIoSubscriber interface, with one minor difference: when passing
      output to the subscribers, it is broken up into lines, and the strings sent
      to the subscriber include the trailing carriage return/newline characters.
       
      The module provides two classes that implement IHostIoSubscriber out of the
      box: PowerShellLogging.LogFile and PowerShellLogging.ScriptBlockOutputSubscriber. Both of
      these classes focus only on host Output (Output, Error, Warning, Verbose and
      Debug streams). The LogFile class has certain hard-coded behavior that I
      desire on my own scripts and log files: it prepends each non-blank line of
      output with a date/time string (in a culture-invariant format to avoid confusion
      over time zones or date formats). The ScriptBlockOutputSubscriber class exists
      to provide a dynamic alternative for people who might not want the same logging
      behavior that I use; it simply executes script blocks for each type of output,
      and allows the script writer to decide what to do with the text.
       
      Please note that this is very low-level interception of text, after PowerShell's
      formatting cmdlets have already processed the objects in the pipeline. You cannot
      intercept an ErrorRecord object via the HostInterceptor, for example; you can only
      intercept the several lines of text that are displayed when an ErrorRecord object
      is displayed in the console. This works very well when creating text-based log files,
      but will be of little use if you want to add an Event Log entry or database record
      for an entire error record.
       
  PowerShellLogging Cmdlets
  
      When the PowerShellLogging module is loaded, the following Cmdlets are available:
      
          Cmdlet Descriptions
          --------- --------------------------------
          Enable-LogFile Creates or attaches a LogFile to the interceptor.
          Get-LogFile Retrieves references to attached LogFile objects.
          Disable-LogFile Detaches a LogFile object from the interceptor.
          Enable-OutputSubscriber Creates or attaches a ScriptBlockOutputSubscriber.
          Get-OutputSubscriber Retrieves references to attached ScriptBlockOutputSubscribers.
          Disable-OutputSubscriber Detaches a ScriptBlockOutputSubscriber.
          Suspend-Logging Temporarily stops the interceptor from making calls to subscribers.
          Resume-Logging Resumes interceptor-to-subscriber calls.
  
  Notes
      When creating new references to LogFile or OutputSubscriber objects, the calling script
      must maintain a reference to the resulting objects for as long as they intend the subscriber
      to remain active. As soon as the script releases the reference (either intentionally, or
      due to the variable falling out of scope), the subscriber object becomes eligible for garbage
      collection, and will be detached within a short time.
       
      This is to make sure that subscribers don't remain active for an entire PowerShell session
      by mistake, if a script author forgets to call Disable-LogFile / Disable-OutputSubscriber,
      or if the script crashes before that cleanup code can be called. It is still possible for
      such objects to remain active after a script ends, if the script author chooses to place
      those variables in the Global scope.
       
      This logging technique creates certain "circular reference" style situations which may
      cause infinite output to either the console, or worse, to a log file. For example,
      creating a LogFile object and then executing Get-Content on its file (allowing the output
      of Get-Content to be displayed to the screen) will run forever until either cancelled,
      or until it errors out for some reason (probably because you've just filled your hard disk).
       
      To be on the safe side, I'd recommend not attempting to read the log file at all until
      after you've called Disable-LogFile.
       
      If, for some reason, you need to perform an action like this, that's what the Suspend-Logging
      and Resume-Logging Cmdlets are for.
 
SEE ALSO
    Enable-LogFile
    Get-LogFile
    Disable-LogFile
    Enable-OutputSubscriber
    Get-OutputSubscriber
    Disable-OutputSubscriber
    Suspend-Logging
    Resume-Logging