我想配置与以下日志记录组件控制台应用程序:
- 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'."}
这似乎是无法解析我的配置文件,没有人知道正确的格式应该是什么,或者是别的东西这是错误的? 我用我的创建配置文件的官方文档 。
Answer 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的截面声明两次? 删除第一个。
- 除去第一log4net的截面后,我得到如下:
无法加载文件或程序集“log4net的,版本= 1.2.11.0文化=中性公钥= 669e0ddf0bb1aa2a”或它的一个依赖。 在位于集清单定义不匹配的程序集引用。 (从HRESULT异常:0x80131040)
我下载log4net的1.2.11.0从log4net的网站上,解压缩它,畅通的DLL和你的榜样替代log4net的,它似乎工作。
Answer 2:
我是有这个(或相关)问题,以及和错误狩猎和调试半天后,我把范围缩小到配置问题。
唯一的例外是一样的OP和内部异常的这里面的几个水平没有找到Common.Logging.Log4Net
( FileNotFoundException
)。
看来,对于Common.Logging.Log4Net1211 NuGet包,他们已经更名为Common.Logging.Log4Net1211而不是简单地Common.Logging.Log4Net的的AssemblyName。 这意味着在你app.config
,你需要参考这一新的程序集名称: <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211">
这里是我的整个通用/记录的app.config为参考的部分:
<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>
Answer 3:
我正在使用
Common.Logging v3.3.1.0
同
Common.Logging.Log4Net1213 v3.3.1.0
在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方法的两倍,这是造成例外,如果条件内被抛出,但至少压力关闭了。
Answer 4:
我把它通过安装缺失的软件包工作
Install-Package Common.Logging.Log4Net1211
Answer 5:
你可以尝试用Common.Logging.dll 2.1.1.0版本代替。
您可以下载和自己比较两个版本的来源,但据我可以看到2.1.0.0和2.1.1.0之间的唯一区别是与为了要解决一个框架4.0的错误读取配置设置的变化。 错误的(参见说明书http://support.microsoft.com/kb/2580188 )是指从其中我不是从网络上运行的网络共享运行,尚未使用2.1.0.0测试的应用程序产生的相同的错误你得到,而2.1.1.0没有。
如果您使用的是预计common.logging.dll的2.1.0.0版本的另一库,那么你应该能够使用汇编重定向时使用2.1.1.0来代替。
PS
不知道是否是相关的,但我离开的DLL作为Common.Logging.Log4Net121.dll的名称和修改的app.config代替
Answer 6:
我发现,这是由于Common.Logging.Log4Net1211 NuGet包retrieveing Common.Logging的旧版本。 检查的NuGet更新Common.Logging,如果你找到一个下载它,然后再试一次。
Answer 7:
尽管这是一个老问题,我有这个问题了几个星期,没有电流答案似乎补救。 似乎我的配置是正确的,因为我使用了几乎相同的配置没有问题,许多其他应用程序。 相当多的调试,并通过踪迹运行后,我终于找到了问题。
请注意,在IIS中,我下另一个应用程序托管的API应用程序。 在这种情况下,两个阵营的应用和它下面的API应用程序正在使用Common.Logging两者。 正因为如此,双方web.config
文件获取加载,Common.Logging读取阵营的配置,那么它看到API具有配置和试图读取为好,看到Common.Logging部分,并抛出了,因为它已经读到从营地中的应用。
到底的解决方案是从IIS中的CAMP应用下移出的API。 一个obsucre边缘情况的位,但也许其他人可能面对这样的问题,有一天。
Answer 8:
如果你的log4net的是2.0.6或以上,可以方便使用Common.Logging.Log4Net.Universal包。
文章来源: Failed obtaining configuration for Common.Logging from configuration section 'common/logging'