从配置部分'common / logging'获取Common.Logging的配置失败

时间:2012-07-06 19:07:37

标签: c# log4net common.logging

我正在尝试使用以下日志记录程序集配置控制台应用程序:

  • Common.Logging.dll(2.1.0.0)
  • Common.Logging.Log4Net1211.dll(2.1.0.0)
  • log4net.dll(1.2.11.0)

如果以编程方式配置记录器,那么一切正常:

NameValueCollection properties = new NameValueCollection(); properties["showDateTime"] = "true";    
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter(properties);

但是如果我尝试使用以下配置文件启动它,它就会爆炸:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <sectionGroup name="common">
            <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
        </sectionGroup>
    </configSections>

    <common>
    <logging>
        <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
             <arg key="configType" value="FILE-WATCH"/>
            <arg key="configFile" value="~/Log4NET.xml"/>
        </factoryAdapter>
    </logging>
</common>
</configuration>

以下是相关的错误消息:

{"Unable to cast object of type 'System.Configuration.DefaultSection' to type 'System.Configuration.AppSettingsSection'."}

{"Failed obtaining configuration for Common.Logging from configuration section 'common/logging'."}

似乎无法解析我的配置文件,是否有人知道正确的格式应该是什么,或者是其他错误的东西?我使用the official documentation创建了配置文件。

8 个答案:

答案 0 :(得分:22)

我也有这个(或相关的)问题,经过半天的错误搜索和调试后,我将其缩小到配置问题。

异常与OP和内部异常相同,其中的一些内容未能找到Common.Logging.Log4NetFileNotFoundException)。

似乎对于Common.Logging.Log4Net1211 NuGet包,他们已将程序集名称重命名为 Common.Logging.Log4Net1211 ,而不是简单地 Common.Logging.Log4Net 。这意味着在app.config中您需要引用这个新的程序集名称: <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">

这是app.config的整个common / logging部分供参考:

<common>
  <logging>
    <!-- Notice that it's Log4net1211 -->
    <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">
      <arg key="configType" value="FILE-WATCH" />
      <arg key="configFile" value="~/Log4Net-MAIN.config" />
    </factoryAdapter>
  </logging>
</common>

答案 1 :(得分:12)

您的应用程序(我下载的应用程序)存在两个问题:

  1. app.config中的configSections如下所示:
  2. <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    
        <sectionGroup name="common">
            <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
        </sectionGroup>
    
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    </configSections>
    

    请注意,log4net-section被声明两次?删除第一个。

    1. 删除第一个log4net-section后,我得到以下内容:
    2.   

      无法加载文件或程序集'log4net,Version = 1.2.11.0,Culture = neutral,PublicKeyToken = 669e0ddf0bb1aa2a'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)

      我从log4net网站下载了log4net 1.2.11.0,解压缩后,解锁了dll,并在你的示例中替换了log4net,它似乎正常工作。

答案 2 :(得分:3)

我正在使用

  

Common.Logging v3.3.1.0

  

Common.Logging.Log4Net1213 v3.3.1.0

<{1>}中的

,抛出异常

  

“不允许使用父配置部分”

Common.Logging.ConfigurationSectionHandler.Create方法

抛出异常

为了使这项工作,我必须语法配置适配器

ASP.NET Web API v5

我仍然需要弄清楚为什么IIS / Express会两次调用Create方法,这会导致异常被置于if条件中,但至少目前压力已经消失。

答案 3 :(得分:2)

我通过安装缺少的包

来实现它
Install-Package Common.Logging.Log4Net1211

答案 4 :(得分:1)

您可以尝试使用Common.Logging.dll版本2.1.1.0。

您可以自己下载并比较两个版本的来源,但据我所知,2.1.0.0和2.1.1.0之间的唯一区别是与读取配置设置有关的更改以解决Framework 4.0错误。该错误的描述(参见http://support.microsoft.com/kb/2580188)是指从我没有从网络运行的网络共享运行,但是使用2.1.0.0的测试应用程序会产生与您获得的相同的错误,而2.1.1.0没有& #39;吨

如果您正在使用另一个需要版本2.1.0.0的common.logging.dll的库,那么您应该能够使用程序集重定向来使用2.1.1.0。

PS

不确定它是否相关,但我将dll的名称保留为Common.Logging.Log4Net121.dll并修改了app.config

答案 5 :(得分:1)

我发现这是由于Common.Logging.Log4Net1211 NuGet包检索旧版本的Common.Logging。检查对Common.Logging的NuGet更新,如果您找到一个下载它并再试一次。

答案 6 :(得分:1)

虽然这是一个老问题,但我有几个星期这个问题,目前的答案似乎都没有解决它。似乎我的配置是正确的,因为我有许多其他应用程序使用几乎相同的配置没有问题。经过相当多的调试并运行堆栈跟踪后,我终于找到了问题。

IIS

请注意,在IIS中,我将API应用程序托管在另一个应用程序中。在这种情况下, CAMP 应用程序和它下面的 API 应用程序都使用Common.Logging。因此,两个web.config文件都被加载,Common.Logging读取 CAMP 的配置,然后它看到 API 有配置并尝试阅读它,看到Common.Logging部分并抛出,因为它已经从 CAMP 应用程序中读取了它。

最后,解决方案是将 API 从IIS中的 CAMP 应用程序下移出。有点偏僻的边缘情况,但也许其他人有一天可能会遇到这个问题。

答案 7 :(得分:0)

如果你的log4net是2.0.6或更高版本,使用Common.Logging.Log4Net.Universal包可能会很方便。