Last week I released a new version of Common Logging 2.0 for the .NET platform. You can get the distribution as well as online API and User Reference documentation from the project website. For users of previous versions there is also a section about upgrading to 2.0.
What is Common.Logging?
Similar to Java's Apache commons-logging, Common.Logging is an ultra-thin brigde between different .NET logging implementations based on original work done by the iBatis.NET team. A framework or library using Common.Logging can be used with any logging implementation at runtime and thus doesn't lock a user to a specific framework or worse letting him struggle with different frameworks using different logging implementations.
Common.Logging comes with adapters for all popular logging implementations like log4net and Enterprise Library Logging.
Bridging between logging implementations
You might run into the problem, that libraries used by your application use different logging implementations. Common.Logging allows you to route from those implementations into any logging system of your choice:
Please see reference documentation for an example on how to configure such a bridging scenario.
What's new in 2.0?
Several extensions and improvements were made, namly
- Dropped .NET 1.1 Support
- Added support for Enterprise Library 4.1 Logging
- Extended and improved ILog Interface
- Convenience LogManager.GetCurrentClassLogger() Method
- Bi-directional log event routing between logging implementations (see bridging above)
- Improved performance
I already blogged about comparing Common.Logging performance to System.Diagnostics.Trace. According to a thread on stackoverflow, log4net seems even slower than System.Diagnostics.Trace.
Configuring Common.Logging
For examples on how to configure and use Common.Logging and bridge different logging implementations, please see the user refererence guide. The API documentation contains configuration and usage examples on each adapter implementation. Here is an example for configuring Common.Logging to write messages to the console:
<configuration> <configSections> <sectionGroup name="common"> <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" requirePermission="false" /> </sectionGroup> </configSections> <common> <logging> <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging"> <arg key="level" value="ALL" /> </factoryAdapter> </logging> </common> </configuration>
Using Common.Logging
Using Common.Logging is as simple as shown below:
ILog log = LogManager.GetCurrentClassLogger(); log.DebugFormat("Hi {0}", "dude");
Hint: When using NET 3.5, you can leverage lambda syntax for logging to avoid any performance penalties:
log.Debug( m=>m("value= {0}", obj.ExpensiveToCalculateInformation()) );
This is the equivalent to writing
if (log.IsDebugEnabled) { log.Debug("value={0}", obj.ExpensiveToCalculateInformation()); }
and ensures that you don't have to pay for calculating the debug information message in case level "Debug" is disabled.
Further Roadmap
The following features and improvements are planned for the next release, some of them already in the works:
- Partial Trust compliance (already in the trunk)
- Support for Windows Azure
- Support for Silverlight
- Logging (aka 'Trace') Context support (in progress) see System.Diagnostics.CorrelationManager and log4net contexts for examples
Of course I would like to invite you to submit any feature request, bug reports or other improvement suggestions to the project's issue tracker.
Happy logging!