Click here to Skip to main content
13,090,930 members (47,635 online)
Click here to Skip to main content
Add your own
alternative version

Stats

26.2K views
9 bookmarked
Posted 22 Apr 2012

Common.Logging and Compatibility with Other Libraries

, 19 May 2012
Rate this:
Please Sign up or sign in to vote.
This post shows you how to configure correctly Common.Logging together with Log4Net or NLog and explains the typical problems that you might expect while using this logging library.

It has been the second time since I have run into the issue of correctly configuring Common.Logging on my project. So what is the problem? Let's start with the basics:

Common.Logging should be a generic interface for logging which can be used by other frameworks and libraries to perform logging. The final user (you or me) uses several frameworks in his/her final application and if all of these frameworks will use different logging frameworks, it will turn into a configuration nightmare. So our favorite frameworks such as Spring.NET, Quartz.NET are using Common.Logging. This interface in turn uses a concrete logging framework to perform the logging (the act of writing the log lines to somewhere).

A typical scenario can be, for instance, the Common.Logging and Log4Net combination. In our application configuration file (web.config or app.config), we have to configure Common.Logging to use the Log4Net and then we can continue with the Log4Net configuration specifying what should be logged.

<common>
<logging>
  <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
 <arg key="configType" value="INLINE" />
  </factoryAdapter>
</logging>
</common>

<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%date %-5level %logger - %message%newline"/>
  </layout>
</appender>
</log4net>

My general problem is that Common.Loggin.Log4Net facade is looking for a concrete version of the Log4Net library. Concretely, the version: 'log4net (= 1.2.10)'. That is not a problem if you are not using some other framework which depends on higher version of Log4Net.

In my case, the le_log4net library (the logentries library) is using log4net 2.0. So if you are using NuGet, you might obtain the following exception while adding the references:

A similar thing might happen if you just decide to use the latest Log4Net by default. Then, you might get an exception when initializing Spring.NET context or starting the Quartz.NET scheduler:

Could not load file or assembly 'log4net, Version=1.2.0.30714, Culture=neutral, 
PublicKeyToken=b32731d11ce58905' or one of its dependencies. 
The located assembly's manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040) 

Solution 1: Ignore NuGet, Define Runtime Binding

One way to get around this is to define runtime assembly binding. But this solution forces you to add the reference to log4net manually. NuGet controls the version and won't let you at references on the fly the way that you would. So to get over, add the latest Common.logging.Log4net façade and Log4Net version 2 (which you need for some reason). Then, you have to define the assembly binding in the configuration file.

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
 <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e"/>
 <bindingRedirect oldVersion="1.2.0.0" newVersion="2.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>
</runtime> 

Solution 2: Just Use the Older Version of Log4Net (1.2.10)

If you do not have libraries that are dependent on log4Net version 2.0.0, then just remember to always use log4net 1.2.10. This is the version which Common.Logging.Log4Net is looking for. Or just let NuGet manage it for you. You can add Common.Logging.Log4Net via NuGet and it will automatically load the correct version of Log4Net.

Solution 3: Try Other Logging Library for Instance NLog

This actually is not a real solution. I have experienced similar issues while using NLog, concretely try to use the latest NLog library with the Common.Logging.Nlog façade and you will obtain something similar to:

{"Could not load file or assembly 'NLog, Version=1.0.0.505, Culture=neutral, 
PublicKeyToken=5120e14c03d0593c' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040)":"NLog, Version=1.0.0.505, Culture=neutral, 
PublicKeyToken=5120e14c03d0593c"} 

The solution here is similar, you will have to define Runtime Binding:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
 <assemblyIdentity name="NLog" 

 publicKeyToken="5120e14c03d0593c" culture="neutral" />
 <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime> 

What was interesting here is that NuGet actually took care of this for me. I have just added the Common.Logging.NLog façade and I guess NuGet spotted that I have already NLog 2 and that this Runtime Binding is necessary. If you look at the documentation of bindingRedirect, you will see that we have the right to specify the range of versions in the oldVersion attribute. Here, all the versions will be bound to the 2.0.0.0 version.

Summary

Anyway, NLog and Log4Net are both cool logging frameworks, just use the one you prefer. As I have shown above, it is possible to use them together with Common.Logging. It just takes a few more lines to configure it correctly.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

hoonzis
Software Developer (Junior) OCTO Technology
Czech Republic Czech Republic
Writing software at ITG RFQ-hub.
LinkedIn
Blog
GitHub
Articles at OCTO blog

You may also be interested in...

Pro

Comments and Discussions

 
SuggestionImages and code blocks Pin
Mika Wendelius21-Apr-12 9:00
mvpMika Wendelius21-Apr-12 9:00 
GeneralRe: Images and code blocks Pin
Jan Fajfr21-Apr-12 22:41
memberJan Fajfr21-Apr-12 22:41 
GeneralRe: Images and code blocks Pin
Mika Wendelius21-Apr-12 22:53
mvpMika Wendelius21-Apr-12 22:53 
GeneralRe: Images and code blocks Pin
Jan Fajfr22-Apr-12 0:06
memberJan Fajfr22-Apr-12 0:06 
GeneralRe: Images and code blocks Pin
Mika Wendelius22-Apr-12 0:10
mvpMika Wendelius22-Apr-12 0:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170813.1 | Last Updated 19 May 2012
Article Copyright 2012 by hoonzis
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid