Using log4net with Powershell

Using log4net with Powershell

Years a go when working on a .net project I came across log4net and thought I will give it a shot. Using log4net in my project I immediately saw the advantage of using this logger and adopted it ever since replacing my home made hand crafted logger. Checkout the features page of log4net.

As time went by and I started using Powershell I never really used a logger and just printing to the screen (using the various write options that Powershell offers ) or writing to the Windows Event Viewer was sufficient and I am assuming this would also be the experience of most of you.

But there are times when an automated task is of high importance from a technical perspective or business perspective and you would actually prefer to deploy a logger to log all your operations so that you have a very good understanding of what that task is doing, the time it takes for each step to complete and most important when things go wrong be able to dig inside and understand what has actually happened.

It is of course possible to deploy your own logger but the Apache log4net logger has so many advantages, it’s mature, widely used and supported by the community and it is free so why reinvent the wheel?

If you do wish to deploy your own logger here is a great example to get you going by Adam Bertram, also known as Adam the Automator, from whom I have learned quiet a few things but most important his examples always demonstrate the proper way to code your Powershell scripts.

 

Back to our topic of this post and here is how to deploy log4net in your Powershell scripts:

  1. You will need the bellow bit of code to initialize log4net at your Powershell script
  2. You will need the log4net.dll located at your system

To get the log4net.dll file you can either download the source code from the Apache log4net site and compile it or download the log4net.dll file that I am using on my Windows 10 with Powershell version 5 and that is version 2.0.8.0 compiled for .net 4.5

Initialize log4net using a File Appender for logging messages to a file

# Get the current path
$path = $PSScriptRoot;


#region <Logging>

[string]$log4net_log = Join-Path $path 'log4net_example.log'; #name of the log file that will get created in the working directory if a path is not specified
[string]$log4net_dll = Join-Path $path 'log4net.dll';

[void][Reflection.Assembly]::LoadFile($log4net_dll);
[log4net.LogManager]::ResetConfiguration();

# File Appender
$FileAppender = new-object log4net.Appender.FileAppender(([log4net.Layout.ILayout]`
        (new-object log4net.Layout.PatternLayout('%date{yyyy-MM-dd HH:mm:ss.fff}  %level  %message%n')), $log4net_log,  $True));

$FileAppender.Threshold = [log4net.Core.Level]::All;
[log4net.Config.BasicConfigurator]::Configure($FileAppender);

$Log = [log4net.LogManager]::GetLogger("root");
#endregion



# Write to log
$Log.Debug('Debug Debug Debug');
$Log.Info('Info Info Info');
$Log.Warn('Warn Warn Warn');
$Log.Error('Error Error Error');

Initialize log4net using a Console Appender for logging messages to the console

# ConsoleAppender
$ColoredConsoleAppender = new-object log4net.Appender.ColoredConsoleAppender(([log4net.Layout.ILayout](new-object log4net.Layout.PatternLayout('%date{yyyy-MM-dd HH:mm:ss.fff}  %level  %message%n'))));

$ColoredConsoleAppenderDebugCollorScheme=new-object log4net.Appender.ColoredConsoleAppender+LevelColors; $ColoredConsoleAppenderDebugCollorScheme.Level=[log4net.Core.Level]::Debug; $ColoredConsoleAppenderDebugCollorScheme.ForeColor=[log4net.Appender.ColoredConsoleAppender+Colors]::Green;
$ColoredConsoleAppender.AddMapping($ColoredConsoleAppenderDebugCollorScheme);

$ColoredConsoleAppenderInfoCollorScheme=new-object log4net.Appender.ColoredConsoleAppender+LevelColors; $ColoredConsoleAppenderInfoCollorScheme.level=[log4net.Core.Level]::Info; $ColoredConsoleAppenderInfoCollorScheme.ForeColor=[log4net.Appender.ColoredConsoleAppender+Colors]::White;
$ColoredConsoleAppender.AddMapping($ColoredConsoleAppenderInfoCollorScheme);

$ColoredConsoleAppenderWarnCollorScheme=new-object log4net.Appender.ColoredConsoleAppender+LevelColors; $ColoredConsoleAppenderWarnCollorScheme.level=[log4net.Core.Level]::Warn; $ColoredConsoleAppenderWarnCollorScheme.ForeColor=[log4net.Appender.ColoredConsoleAppender+Colors]::Yellow;
$ColoredConsoleAppender.AddMapping($ColoredConsoleAppenderWarnCollorScheme);

$ColoredConsoleAppenderErrorCollorScheme=new-object log4net.Appender.ColoredConsoleAppender+LevelColors; $ColoredConsoleAppenderErrorCollorScheme.level=[log4net.Core.Level]::Error; $ColoredConsoleAppenderErrorCollorScheme.ForeColor=[log4net.Appender.ColoredConsoleAppender+Colors]::Red;
$ColoredConsoleAppender.AddMapping($ColoredConsoleAppenderErrorCollorScheme);

$ColoredConsoleAppender.Threshold = [log4net.Core.Level]::All;
[log4net.Config.BasicConfigurator]::Configure($ColoredConsoleAppender);

The following two tabs change content below.
Yaniv Etrogi is an SQL Server consultant. He loves SQL Server and he is passionate about Performance Tuning, Automation and Monitoring.

Leave a Comment

Your email address will not be published. Required fields are marked *