Log4Net“无法找到架构信息”消息

时间:2008-10-06 14:11:18

标签: web-services logging schema web-config log4net

我决定使用log4net作为新的Web服务项目的记录器。一切都运行正常,但是我在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
  3. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]
    

    nemo补充道:

      

    向任何人发出警告   遵循答案中的建议   这个帖子。有可能   具有log4net的安全风险   关闭root的xml配置   Web服务,就像它一样   任何人都可以默认访问。只是   如果你的配置,请告知   包含敏感数据,您可能需要   把它放在哪里。


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

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

    并将处理log4net的所有内容放在该文件中,但我仍然收到相同的消息。

13 个答案:

答案 0 :(得分:68)

您可以在架构中绑定log4net元素。有几个漂浮在周围,大多数没有完全提供各种可用选项。我创建了以下xsd以提供尽可能多的验证: 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">

答案 1 :(得分:17)

我有不同的看法,需要以下语法:

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

与xsl的上一篇文章不同,但对我有所帮助。看看这个blog post,它帮助了我。

答案 2 :(得分:9)

只需向任何人发出警告,请遵循此主题中答案的建议。将x4中的log4net配置放在Web服务的根目录下可能存在安全风险,因为默认情况下任何人都可以访问它。如果您的配置包含敏感数据,请注意,您可能希望将其放在哪里。

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

@Wheelie:我无法尝试你的建议,因为我需要一个适用于未经修改的Visual Studio安装的解决方案。


总结一下,以下是解决问题的方法:

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

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

Roger's answer,他提供了一个架构,除了评论者提到的

之外,这对我来说非常有效。
  

这个XSD抱怨使用自定义appender。它只允许默认集(定义为枚举)中的appender而不是简单地将其设为字符串字段

我修改了名为xs:simpletype的{​​{1}}的原始架构并删除了枚举。我将其限制为基本的.NET输入模式(我说基本因为它只支持 typename ,或 typename,assembly - 但是有人可以扩展它。

只需将log4netAppenderTypes定义替换为XSD中的以下内容:

log4netAppenderTypes

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

<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>

答案 8 :(得分:1)

您是否尝试过使用单独的log4net.config文件?

答案 9 :(得分:1)

我通过将xsd文件放在visual studio schemas文件夹中来构建一个测试asp项目,如上所述(对我来说它是C:\ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas)然后制作我的{ {1}}看起来像这样:

web.config

答案 10 :(得分:0)

不修改Visual Studio安装,并考虑正确的版本控制等。在团队的其他成员中,将.xsd文件添加到您的解决方案中(作为“解决方案项目”),或者如果您只想将其用于特定项目,只需将其嵌入到那里。

答案 11 :(得分:0)

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

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

可以将其定义为类型&#34; System.Configuration.IgnoreSectionHandler&#34;是Visual Studio在log4net上没有显示任何警告/错误消息的原因吗?

答案 12 :(得分:0)

我遵循了Kit的回答https://stackoverflow.com/a/11780781/6139051,但它不适用于像“log4net.Appender.TraceAppender,log4net”这样的AppenderType值。 log4net.dll程序集的AssemblyTitle为“log4net”,即程序集名称里面没有一个点,这就是为什么Kit的答案中的正则表达式不起作用的原因。我必须在正则表达式中的第三个括号组之后添加问号,然后才能完美地工作。

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

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