Log4Net“无法find架构信息”消息

我决定使用log4net作为一个新的Web服务项目的logging器。 一切工作正常,但我得到了很多像下面这样的消息,对于我在web.config使用的每个log4net标记:

找不到元素“log4net”的架构信息…

以下是我的web.config的相关部分:

  <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="C:\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="100KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level: %message%newline" /> </layout> </appender> <logger name="TIMServerLog"> <level value="DEBUG" /> <appender-ref ref="RollingFileAppender" /> </logger> </log4net> 

解决了:

  1. 将每个log4net特定标记复制到一个单独的xml文件。 确保使用.xml作为文件扩展名。
  2. 将以下行添加到AssemblyInfo.cs
 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)] 

nemo补充说:

任何人都可以在这个post中听到这个答案的build议。 通过将xml中的log4netconfiguration置于Web服务的根目录之外,可能存在安全风险,因为默认情况下任何人都可以访问它。 只是build议如果你的configuration包含敏感数据,你可能想把它放在其他地方。


@ wcm:我尝试使用单独的文件。 我将以下行添加到AssemblyInfo.cs

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

把处理log4net的所有东西放到那个文件中,但是我仍然得到相同的消息。

我有一个不同的需要,并需要以下语法:

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)] 

这与xsl的最后一篇文章有​​所不同,但对我有所帮助。 看看这个博客文章 ,它帮助了我。

您可以将模式绑定到log4net元素。 有几个浮动,大多数不完全提供各种可用的选项。 我创build了以下xsd以提供尽可能多的validation: http : //csharptest.net/downloads/schema/log4net.xsd

您可以通过修改log4net元素将它绑定到xml中:

 <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

任何人都可以在这个post中听到这个答案的build议。 通过将xml中的log4netconfiguration置于Web服务的根目录之外,可能存在安全风险,因为默认情况下任何人都可以访问它。 只是build议如果你的configuration包含敏感数据,你可能想把它放在其他地方。

我相信你看到的消息,因为Visual Studio不知道如何validationconfiguration文件的log4net部分。 您应该能够通过将log4net XSD复制到C:\ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas(或Visual Studio的安装位置)来解决此问题。 作为额外的奖励,您现在应该获得对log4net的智能感知支持

其实你不需要坚持.xml的扩展名。 您可以在ConfigFileExtension属性中指定任何其他扩展名:

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)] 

@steve_mtl:将文件扩展名从.config更改为.xml解决了这个问题。 谢谢。

@Wheelie:我无法尝试你的build议,因为我需要一个解决scheme,与未经修改的Visual Studio安装一起工作。


总结一下,这里是如何解决这个问题的:

  1. 将每个log4net特定标记复制到一个单独的xml文件。 确保使用.xml作为文件扩展名。
  2. 将以下行添加到AssemblyInfo.cs

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

对于VS2008,只需将log4net.xsd文件添加到您的项目; VS查看项目文件夹以及Wheelie提到的安装目录。

此外,使用.config扩展名而不是.xml避免了安全问题,因为默认情况下IIS不提供* .config文件。

你有没有尝试过使用单独的log4net.config文件?

在罗杰的回答中 ,他提供了一个模式,除了提到评论者的地方,这对我来说效果很好

这个XSD抱怨使用自定义的appender。 它只允许一个appender从默认设置(定义为一个枚举),而不是简单地把这个string字段

我修改了具有名为log4netAppenderTypesxs:simpletype的原始模式,并删除了枚举。 我把它限制在一个基本的.NETtypes模式中(我说基本的,因为它只支持typename ,或者typename,程序集 – 但是有人可以扩展它。

只需在XSD中将log4netAppenderTypes定义replace为以下内容即可:

 <xs:simpleType name="log4netAppenderTypes"> <xs:restriction base="xs:string"> <xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)+)?"/> </xs:restriction> </xs:simpleType> 

如果他想把它包含在他的正式版本中,我会把它传递给原作者。 在此之前,您必须下载并修改xsd并以相对方式引用它,例如:

 <log4net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd"> <!-- ... --> </log4net> 

我得到了一个testing的asp项目,如上所述,把xsd文件放在visual studio schemas文件夹中(对于我来说,它是C:\ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas),然后使我的web.config看起来喜欢这个:

 <?xml version="1.0"?> <!-- Note: As an alternative to hand editing this file you can use the web admin tool to configure settings for your application. Use the Website->Asp.Net Configuration option in Visual Studio. A full list of settings and comments can be found in machine.config.comments usually located in \Windows\Microsoft.Net\Framework\v2.x\Config --> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <appSettings> </appSettings> <connectionStrings> </connectionStrings> <system.web> <trace enabled="true" pageOutput="true" /> <!-- Set compilation debug="true" to insert debugging symbols into the compiled page. Because this affects performance, set this value to true only during development. --> <compilation debug="true" /> <!-- The <authentication> section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> <authentication mode="Windows" /> <customErrors mode="Off"/> <!-- <customErrors mode="Off"/> The <customErrors> section enables configuration of what to do if/when an unhandled error occurs during the execution of a request. Specifically, it enables developers to configure html error pages to be displayed in place of a error stack trace. <customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> </system.web> <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!-- Please make shure the ..\\Logs directory exists! --> <param name="File" value="Logs\\Log4Net.log"/> <!--<param name="AppendToFile" value="true"/>--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/> </layout> </appender> <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> <to value="" /> <from value="" /> <subject value="" /> <smtpHost value="" /> <bufferSize value="512" /> <lossy value="true" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date [%thread] %-5level %logger [%property] - %message%newline%newline%newline" /> </layout> </appender> <logger name="File"> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> </logger> <logger name="EmailLog"> <level value="ALL" /> <appender-ref ref="SmtpAppender" /> </logger> </log4net> </configuration> 

不修改你的Visual Studio安装,并考虑到适当的版本/等。 在您的团队的其他成员中,将.xsd文件添加到您的解决scheme(作为“解决scheme项目”),或者如果您只希望将其用于特定项目,则只需将其embedded到该解决scheme中即可。

我注意到它有点晚了,但如果你看看log4net提供的例子,你可以看到他们把所有的configuration数据放到一个app.config中,有一点不同,就是configsection的注册:

 <!-- Register a section handler for the log4net section --> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> 

可以将它定义为types“System.Configuration.IgnoreSectionHandler”的原因是Visual Studio不会在log4net的东西上显示任何警告/错误消息?

我遵循Kit的回答https://stackoverflow.com/a/11780781/6139051 ,它不适用于AppenderType值,如“log4net.Appender.TraceAppender,log4net”。 该log4net.dll程序集有“log4net”的AssemblyTitle,即程序集名称内没有一个点,这就是为什么Kit的答案中的正则expression式不起作用。 我必须在正则expression式中的第三个括号组之后添加问号,之后它的工作完美无缺。

修改后的正则expression式如下所示:

 <xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>