无法从配置部分’common / logging’获取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);
但是,如果我尝试使用以下配置文件启动它,它会爆炸:
这些是相关的错误消息:
{"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'."}
它似乎无法解析我的配置文件,是否有人知道正确的格式应该是什么,或者是其他错误的东西? 我使用官方文档创建了配置文件。
您的应用程序有两个问题(我下载的那个):
- app.config中的configSections如下所示:
请注意log4net-section被声明两次? 删除第一个。
- 删除第一个log4net-section后,我得到以下内容:
无法加载文件或程序集’log4net,Version = 1.2.11.0,Culture = neutral,PublicKeyToken = 669e0ddf0bb1aa2a’或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (HRESULTexception:0x80131040)
我从log4net网站下载了log4net 1.2.11.0,解压缩它,解锁了dll并替换了你的示例中的log4net,它似乎工作。
我也有这个(或相关的)问题,经过半天的错误搜索和调试后,我将其缩小到配置问题。
exception与OP和内部exception相同,其中的一些内容未能找到Common.Logging.Log4Net
( FileNotFoundException
)。
似乎对于Common.Logging.Log4Net1211 NuGet包,他们已将程序集名称重命名为Common.Logging.Log4Net1211而不是简单的Common.Logging.Log4Net 。 这意味着在app.config
需要引用这个新的程序集名称:
这是app.config的整个common / logging部分供参考:
我正在使用
Common.Logging v3.3.1.0
同
Common.Logging.Log4Net1213 v3.3.1.0
在ASP.NET Web API v5
,它抛出exception
“不允许使用父配置部分”
从Common.Logging.ConfigurationSectionHandler.Create方法抛出exception
为了使这项工作,我不得不语法配置适配器
var properties = new Common.Logging.Configuration.NameValueCollection(); properties["configType"] = "INLINE"; Common.Logging.LogManager.Adapter = new Log4NetLoggerFactoryAdapter(properties);
我仍然要弄清楚为什么IIS / Express会两次调用Create方法,这会导致exception被置于if条件中,但至少目前压力已经消失。
我通过安装丢失的包来实现它
Install-Package Common.Logging.Log4Net1211
您可以尝试使用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。
PS
不确定它是否相关,但我将dll的名称保留为Common.Logging.Log4Net121.dll并修改了app.config而不是
我发现这是由于Common.Logging.Log4Net1211 NuGet包检索旧版本的Common.Logging。 检查对Common.Logging的NuGet更新,如果您找到一个下载它并再试一次。
如果您的log4net是2.0.6或更高版本,使用Common.Logging.Log4Net.Universal包可能会很方便。
虽然这是一个老问题,但我有几周这个问题,目前的答案似乎都没有解决它。 看起来我的配置是正确的,因为我有许多其他应用程序使用几乎相同的配置没有问题。 经过相当多的调试并运行堆栈跟踪后,我终于找到了问题。
请注意,在IIS中,我将API应用程序托管在另一个应用程序下。 在这种情况下, CAMP应用程序和它下面的API应用程序都使用Common.Logging。 因此,两个web.config
文件都被加载,Common.Logging读取CAMP的配置,然后它看到API有配置并尝试读取它,看到Common.Logging部分并抛出,因为它已经读取了来自CAMP应用程序。
最后,解决方案是将API从IIS中的CAMP应用程序下移出。 有点偏僻的边缘情况,但也许其他人有一天可能会遇到这个问题。