23

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

  • 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'."}

似乎无法解析我的配置文件,有谁知道正确的格式应该是什么,还是其他什么问题?我使用官方文档创建了我的配置文件。

4

8 回答 8

24

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

该异常与 OP 相同,并且其内部的几个级别的内部异常未能找到Common.Logging.Log4Net( FileNotFoundException)。

似乎对于 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>
于 2012-08-22T11:03:11.653 回答
14

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

  1. app.config 中的 configSections 如下所示:
<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 部分后,我得到以下信息:

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

我从 log4net 网站下载了 log4net 1.2.11.0,解压缩,解封 dll 并替换了示例中的 log4net,它似乎可以工作。

于 2012-07-25T12:50:40.177 回答
3

我正在使用

Common.Logging v3.3.1.0

Common.Logging.Log4Net1213 v3.3.1.0

in ASP.NET Web API v5,抛出异常

“不允许父配置部分”

Common.Logging.ConfigurationSectionHandler.Create方法抛出异常

为了完成这项工作,我必须在语法上配置适配器

var properties = new Common.Logging.Configuration.NameValueCollection();
properties["configType"] = "INLINE";
Common.Logging.LogManager.Adapter = new Log4NetLoggerFactoryAdapter(properties);

我仍然需要弄清楚为什么 IIS/Express 两次调用 Create 方法,这导致在 if 条件内抛出异常,但至少现在压力已经关闭。

于 2016-09-20T16:00:10.437 回答
2

我通过安装丢失的包来让它工作

Install-Package Common.Logging.Log4Net1211
于 2014-10-01T10:42:35.727 回答
2

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

IIS

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

最后,解决方案是将API从IIS 中的CAMP应用程序下移出。有点晦涩的边缘案例,但也许有一天其他人可能会面临这个问题。

于 2018-06-06T13:08:00.427 回答
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 没有。

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

附言

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

于 2012-07-19T16:26:58.157 回答
1

我发现这是由于 Common.Logging.Log4Net1211 NuGet 包检索了旧版本的 Common.Logging。检查对 Common.Logging 的 NuGet 更新,如果找到,请下载并重试。

于 2013-01-31T17:07:50.803 回答
0

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

于 2017-10-17T13:09:00.267 回答