我想从Spring.NET Aspect库使用log4方面和log4Net一起使用。 我发现this article如何将log4Net与Common Logging API一起使用。
我的测试应用程序是控制台,基于.NET 4.0客户端配置文件。
所以我在我的项目中引用这些库:
上面的程序集来自Program Files \ Spring.NET 1.3.2 \ bin \ net \ 4.0
我无法在 Program Files \ Spring.NET 1.3.2 \ bin中找到程序集Common.Logging.Log4Net.dll \ net \ 4.0 所以我下载这个程序集from SourceForge:
我在app.config中配置了logger:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
</sectionGroup>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<common>
<logging>
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
<arg key="configType" value="INLINE" />
</factoryAdapter>
</logging>
</common>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="myLogger">
<level value="DEBUG" />
</logger>
</log4net>
<spring>
<context>
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net">
</objects>
</spring>
</configuration>
并尝试了这个:
ILog log = LogManager.GetLogger("myLogger");
log.Error("hello world");
我收到了这个运行时错误:
{&#34;无法从配置部分配置Common.Logging &#39;公共/记录&#39;&#34;}
内部异常:
{&#34;创建配置节处理程序时出错 common / logging:无法创建类型 &#39; Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net&#39; (E:\ C# 项目\研究\ SPRING.NET \ SpringNet.Aspects \ LoggingWithLog4Net \ BIN \调试\ LoggingWithLog4Net.vshost.exe.Config 第18行&#34;}
堆栈跟踪:
在System.Configuration.BaseConfigurationRecord.EvaluateOne(String [] keys,SectionInput输入,Boolean isTrusted,FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult)at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult, Boolean getLkg,Boolean getRuntimeObject,Object&amp;结果,对象&amp; resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp;结果,对象&amp; resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp;结果,对象&amp; resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object&amp;结果,对象&amp; resultRuntimeObject)at System.Configuration.BaseConfigurationRecord.GetSection(字符串 configKey) System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(字符串 sectionName)at System.Configuration.ConfigurationManager.GetSection(字符串 sectionName)at System.Configuration.ConfigurationSettings.GetConfig(字符串 sectionName)at Common.Logging.ConfigurationReader.GetSection(String sectionName)
在Common.Logging.LogManager.BuildLoggerFactoryAdapter()
我认为问题必须是程序集Common.Logging.Log4Net version 2.0.0.0 runtime v2.0.50727 的版本。因为我使用了Common.Logging 版本:1.2.0.0,运行时v1.0.3705 。
所以我将Common.Logging版本从1.2.0.0更改为2.0.0.0。我使用了来自SourceForge的Common.Logging。
再次测试。我收到了这个错误:
无法创建类型 &#39; Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net&#39;
内部异常:
{&#34;无法加载文件或程序集&#39; Common.Logging.Log4Net&#39;或者其中之一 它的依赖关系。系统找不到该文件 指定&#34;:&#34; Common.Logging.Log4Net&#34;}
堆栈跟踪:
at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly, StackCrawlMarkHandle stackMark,Boolean loadTypeFromPartialName, ObjectHandleOnStack类型)at System.RuntimeTypeHandle.GetTypeByName(String name,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly, StackCrawlMark&安培; stackMark,Boolean loadTypeFromPartialName)at System.RuntimeType.GetType(String typeName,Boolean throwOnError, Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMark&amp; stackMark) 在System.Type.GetType(String typeName,Boolean throwOnError,Boolean ignoreCase)at Common.Logging.ConfigurationSectionHandler.ReadConfiguration(XmlNode的 部分) C:\ CCNET \ netcommon \树干\模块\ Common.Logging \ SRC \共同\ Common.Logging \记录\ ConfigurationSectionHandler.cs:线 130
最后我在spring示例中找到了程序集Common.Logging.Log4Net 1.2.0.2版,所以我用它。
经过测试并再次出现错误:
{&#34;无法从配置部分配置Common.Logging &#39;公共/记录&#39;&#34;}
内部异常:
{&#34;创建配置节处理程序时出错 common / logging:无法创建类型 &#39; Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net&#39; (E:\ C# 项目\研究\ SPRING.NET \ SpringNet.Aspects \ LoggingWithLog4Net \ BIN \调试\ LoggingWithLog4Net.vshost.exe.Config 第18行&#34;}
堆栈跟踪:
{&#34;无法创建类型 &#39; Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net&#39;&#34;}
我真的很困惑我的坏事?程序集版本有些问题吗?
答案 0 :(得分:5)
对于Spring.NET 1.3.2,您应该使用:
确保将最后两个log4net
dll复制到输出目录。由于您的代码不直接引用它,因此Visual Studio可能无法复制它们。
答案 1 :(得分:1)
此外,而不是
<resource uri="config://springs/objects"/>
尝试
<resource uri="config://spring/objects"/>
在你的配置文件中,sectionGroup名称是&#34; spring&#34;,NOT&#34; spring&#34;。我从你的身上复制了我的工作并遇到了同样的问题。终于找到了原因。
希望有所帮助!
答案 2 :(得分:1)
另一种可能性是:
我建议跳过Common.Logging 2.1.0,因为它在读取完全有效的app.config部分时会抛出此异常:
“无法将类型为'System.Configuration.DefaultSection'的对象强制转换为'System.Configuration.AppSettingsSection'。”
安装2.1.1修复了问题。