cjbhaines / Log4Net.Async

Asynchronous Log4Net appenders and forwarder
http://www.nuget.org/packages/Log4Net.Async/
MIT License
121 stars 37 forks source link

System.InvalidCastException: Unable to cast object 'Log4Net.Async.ParallelForwardingAppender' to type 'log4net.Appender.IAppender'. #23

Closed rekosko closed 8 years ago

rekosko commented 8 years ago

Hello,

I'm struggling with log4net for quite some time. I'm using unsigned log4net.1.2.11.0.dll version in my Umbraco installation. Due to different log4net version issues in Umbraco I've set up assembly binding in my project like this:

<dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="null" />
    <codeBase version="1.2.11.0" href="bin/Dependencies/log4net.1.2.11.0.dll" />
</dependentAssembly>
<dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.2.15.0" newVersion="1.2.15.0" />
</dependentAssembly>

My project csproj:

<Reference Include="log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
  <HintPath>..\..\packages\log4net.2.0.5\lib\net45-full\log4net.dll</HintPath>
  <Private>True</Private>
</Reference>
<Reference Include="Log4Net.Async, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\..\packages\Log4Net.Async.2.0.1.0\lib\net40\Log4Net.Async.dll</HintPath>
  <Private>True</Private>
</Reference>

and my log4.net config is:

<?xml version="1.0"?>
<log4net>

  <root>
    <priority value="Info"/>
    <appender-ref ref="asyncForwarder" />
  </root>

  <appender name="rollingFile" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="App_Data\Logs\UmbracoTraceLog.%property{log4net:HostName}.txt" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <maximumFileSize value="5MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value=" %date [P%property{processId}/D%property{appDomainId}/T%thread] %-5level %logger - %message%newline" />
    </layout>
    <encoding value="utf-8" />
  </appender>

  <appender name="asyncForwarder" type="Log4Net.Async.ParallelForwardingAppender,Log4Net.Async">
    <appender-ref ref="rollingFile" />
    <bufferSize value="200" />
  </appender>

  <logger name="Jumoo.uSync">
    <level value="Debug" />
  </logger>

</log4net>

I've also created my custom Logger in class library which also uses log4net newest version and I'm referencing this library in my web project. It looks similar to this:

public class Logger : ILogger
{
    public Logger(FileInfo log4NetConfigFile)
        : this()
    {
        XmlConfigurator.Configure(log4NetConfigFile);
    }
    // code removed for readibility...
}

This logger is then registered using Autofac in my project:

builder.Register(c => new Logging.Logger(new FileInfo(WebConfigurationManager.AppSettings["log4net.Config"])))
               .As<Logging.ILogger>().SingleInstance();

The app is building and starting without any visible errors but in Debug window I get:

log4net:ERROR Could not create Appender [asyncForwarder] of type [Log4Net.Async.ParallelForwardingAppender,Log4Net.Async]. Reported error follows.
System.InvalidCastException: Unable to cast object 'Log4Net.Async.ParallelForwardingAppender' to type 'log4net.Appender.IAppender'.
   in log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
log4net:ERROR Appender named [asyncForwarder] not found.

My knowledge about assemblies and making them all work together is rather... eh... not existing so I'm asking for your help. What I'm doing wrong? Could you please help me. Thanks.

Edit: this is what I get in Output window:

This:

log4net: log4net assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=null]. Loaded from [C:\Users\rosko\AppData\Local\Temp\Temporary ASP.NET Files\vs\ca64ae82\ac456314\assembly\dl3\70695718\0027e966_2496d101\log4net.1.2.11.0.dll]. (.NET Runtime [4.0.30319.42000] on Microsoft Windows NT 10.0.10586.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Umbraco.Core, Version=1.0.5948.18141, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Umbraco.Core, Version=1.0.5948.18141, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\rosko\AppData\Local\Temp\Temporary ASP.NET Files\vs\ca64ae82\ac456314\assembly\dl3\5dd6a5e7\0027e966_2496d101\Umbraco.Core.dll]
log4net: Assembly [Umbraco.Core, Version=1.0.5948.18141, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Umbraco.Core, Version=1.0.5948.18141, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Loading configuration for default repository from AppSettings specified Config URI [file:///C:/Users/rosko/Documents/Repositories/Purogurama/src/Rarar.Web/config/log4net.config]
log4net: configuring repository [log4net-default-repository] using URI [file:///C:/Users/rosko/Documents/Repositories/Purogurama/src/Rarar.Web/config/log4net.config]
log4net: configuring repository [log4net-default-repository] using file [C:\Users\rosko\Documents\Repositories\Purogurama\src\Rarar.Web\config\log4net.config]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [Info].
log4net: Logger [root] level set to [name="INFO",value=40000].
log4net: Loading Appender [asyncForwarder] type: [Log4Net.Async.ParallelForwardingAppender,Log4Net.Async]
log4net:ERROR Could not create Appender [asyncForwarder] of type [Log4Net.Async.ParallelForwardingAppender,Log4Net.Async]. Reported error follows.
System.InvalidCastException: Nie można rzutować obiektu typu 'Log4Net.Async.ParallelForwardingAppender' na typ 'log4net.Appender.IAppender'.
   w log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement)
log4net:ERROR Appender named [asyncForwarder] not found.
log4net: Retrieving an instance of log4net.Repository.Logger for logger [Jumoo.uSync].
log4net: Setting [Jumoo.uSync] additivity to [True].
log4net: Logger [Jumoo.uSync] Level string is [Debug].
log4net: Logger [Jumoo.uSync] level set to [name="DEBUG",value=30000].
log4net: Hierarchy Threshold []
log4net: No appenders could be found for logger [Umbraco.Core.CoreBootManager] repository [log4net-default-repository]
log4net: Please initialize the log4net system properly.
log4net:     Current AppDomain context information: 
log4net:        BaseDirectory   : C:\Users\rosko\Documents\Repositories\Purogurama\src\Rarar.Web\
log4net:        FriendlyName    : /LM/W3SVC/2/ROOT-1-131070497179101448
log4net:        DynamicDirectory: C:\Users\rosko\AppData\Local\Temp\Temporary ASP.NET Files\vs\ca64ae82\ac456314

and:

log4net: log4net assembly [log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\Users\rosko\AppData\Local\Temp\Temporary ASP.NET Files\vs\ca64ae82\ac456314\assembly\dl3\29205a06\00697323_6333d101\log4net.dll]. (.NET Runtime [4.0.30319.42000] on Microsoft Windows NT 10.0.10586.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Rarar.Core, Version=1.0.5971.1916, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Rarar.Core, Version=1.0.5971.1916, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\rosko\AppData\Local\Temp\Temporary ASP.NET Files\vs\ca64ae82\ac456314\assembly\dl3\342b8c75\648b888f_eba7d101\Rarar.Core.dll]
log4net: Assembly [Rarar.Core, Version=1.0.5971.1916, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Rarar.Core, Version=1.0.5971.1916, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Loading configuration for default repository from AppSettings specified Config URI [file:///C:/Users/rosko/Documents/Repositories/Purogurama/src/Rarar.Web/config/log4net.config]
log4net: configuring repository [log4net-default-repository] using URI [file:///C:/Users/rosko/Documents/Repositories/Purogurama/src/Rarar.Web/config/log4net.config]
log4net: configuring repository [log4net-default-repository] using file [C:\Users\rosko\Documents\Repositories\Purogurama\src\Rarar.Web\config\log4net.config]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [Info].
log4net: Logger [root] level set to [name="INFO",value=40000].
log4net: Loading Appender [asyncForwarder] type: [Log4Net.Async.ParallelForwardingAppender,Log4Net.Async]
log4net: Attaching appender named [rollingFile] to appender named [asyncForwarder].
log4net: Loading Appender [rollingFile] type: [log4net.Appender.RollingFileAppender]
log4net: Parameter [file] specified subtype [log4net.Util.PatternString]
log4net: Converter [literal] Option [App_Data\Logs\UmbracoTraceLog.] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [property] Option [log4net:HostName] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [.txt] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Performing additional conversion of value from [PatternString] to [String]
log4net: Setting Property [File] to String value [App_Data\Logs\UmbracoTraceLog.DESKTOP.txt]
log4net: Setting Property [LockingModel] to object [log4net.Appender.FileAppender+MinimalLock]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [RollingStyle] to RollingMode value [Date]
log4net: Setting Property [MaximumFileSize] to String value [5MB]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [ %date [P%property{processId}/D%property{appDomainId}/T%thread] %-5level %logger - %message%newline]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [date] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [P] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [property] Option [processId] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [/D] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [property] Option [appDomainId] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [/T] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=True]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Setting Property [Encoding] to UTF8Encoding value [System.Text.UTF8Encoding]
log4net: Type = [0], r0 = [.1970-01-01], r1 = [.1970-01-01]
log4net: Type = [1], r0 = [.1970-01-01], r1 = [.1970-01-01]
log4net: Type = [2], r0 = [.1970-01-01], r1 = [.1970-01-01]
log4net: Type = [3], r0 = [.1970-01-01], r1 = [.1970-01-02]
log4net: Searched for existing files in [C:\Users\rosko\Documents\Repositories\Purogurama\src\Rarar.Web\App_Data\Logs]
log4net: curSizeRollBackups starts at [0]
log4net: [.2016-05-07] vs. [.2016-05-07]
log4net: Opening file for writing [C:\Users\rosko\Documents\Repositories\Purogurama\src\Rarar.Web\App_Data\Logs\UmbracoTraceLog.DESKTOP.txt] append [True]
log4net: Created Appender [rollingFile]
log4net: Setting Property [BufferSize] to Int32 value [200]
log4net: Created Appender [asyncForwarder]
log4net: Adding appender named [asyncForwarder] to logger [root].
log4net: Retrieving an instance of log4net.Repository.Logger for logger [Jumoo.uSync].
log4net: Setting [Jumoo.uSync] additivity to [True].
log4net: Logger [Jumoo.uSync] Level string is [Debug].
log4net: Logger [Jumoo.uSync] level set to [name="DEBUG",value=30000].
log4net: Hierarchy Threshold []
log4net: configuring repository [log4net-default-repository] using file [config\log4net.config]
log4net: config file [C:\Program Files (x86)\IIS Express\config\log4net.config] not found. Configuration unchanged.
rcollette commented 8 years ago

It's been a year or more since I've done .NET development but I'm going to go with my recollection and say that you can't load two versions of the same assembly in the same AppDomain.

https://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

rekosko commented 8 years ago

Thank you for answer. After carefully reading the logs again this seems to be the case but unfortunately I have no bloody idea how I can solve that... probably create some another AppDomain and then pair them together or something like that but I don't have experience in that...:/ If nobody can't give me any other tips then I think this question is safe to be closed.

cjbhaines commented 8 years ago

Hi @rekosko,if the assembly binding redirect isn't working I'm not really sure what to suggest here. Sorry!