Log4Net“无法找到模式信息”消息

64

我决定在一个新的webservice项目中使用log4net作为日志记录器。一切都运作良好,但是每当我在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提示:

对于该问题中回答的建议请注意,可能存在安全风险。如果将log4net配置文件放在Web服务根目录之外的xml中,则默认情况下任何人都可以访问它。如果您的配置包含敏感数据,建议将其放在其他地方。


@wcm:我尝试使用一个单独的文件。我在AssemblyInfo.cs中添加了以下行:

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

将所有与log4net有关的内容放在同一个文件中,但我仍然收到相同的消息。

13个回答

78

您可以将模式绑定到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">

18
log4net没有包含XSD非常奇怪。 - James McMahon
有一段时间我实际上没有尝试过这个,因为我无法在Visual Studio 2005下使其工作。它确实可以工作,但仍然会对所有XML元素抛出警告。 - James McMahon
4
这个XSD在抱怨使用自定义appender。它只允许使用默认集合中的appender(定义为枚举),而不是简单地将其作为字符串字段。 - Ben Laan
这对我的情况很有效。我现在能够验证配置文件了。谢谢。 - One-One
2
@BenLaan Roger提供的许可允许您从他的XSD创建一个派生作品。只需复制他的XSD并将您的自定义附加程序添加到<xs:simpleType name="log4netAppenderTypes">部分。然后,您可以将此XSD文件放在任何位置,并从配置文件中引用它(而不是他的)。例如,xsi:noNamespaceSchemaLocation="myschemas\mylog4net.xsd"。 - rcabr
一种替代的、特定于VS的设置模式的方法:https://learn.microsoft.com/en-us/visualstudio/xml-tools/how-to-select-the-xml-schemas-to-use?view=vs-2019 我不知道这是否是明智的做法,但我觉得应该在这里记录下来。 - Grault

17

我的理解与众不同,我需要以下语法:

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

这与xsl的最后一篇文章不同,但对我产生了影响。查看此博客文章,它帮助了我。


虽然它对我起作用了,但在调试输出中,它警告主配置文件中缺少部分。因此,我不得不保留它们,但像这样为空:<log4net> </log4net>,以使警告消失。 - Jader Dias

11

提醒任何遵循本主题答案建议的人留意一下。如果将log4net配置文件放置于Web服务根目录下的XML中,则会存在潜在的安全风险,因为它默认情况下可以被任何人访问。请注意,如果您的配置文件包含敏感数据,您可能需要将其放在其他位置。


15
更好的解决方案是使用 .config 扩展名而不是 .xml。IIS 默认会阻止对 .configs 的请求。 - STW

5

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


4
对于VS 2010,请将上述提到的log4net XSD放入C:\Program Files\Microsoft Visual Studio 10.0\XML\Schemas中。关闭并重新打开VS。打开.config文件,进入菜单项XML-> Schemas,点击log4net.xsd和“Use this Schema”。 - Peter M

4
Roger的回答中,他提供了一个模式,这对我非常有效,除了一位评论者提到的问题:
此XSD在使用自定义附加程序时会发生错误。它仅允许使用默认集(定义为枚举)中的附加程序,而不是仅将其作为字符串字段。
我修改了原始模式,其中包含名为log4netAppenderTypesxs:simpletype并删除了枚举。相反,我将其限制为基本的.NET类型模式(我之所以说是基本的,是因为它仅支持 typename typename,assembly ,但是可以扩展它)
只需用以下内容替换XSD中的 log4netAppenderTypes 定义即可:
<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>

1
这实际上是有意为之的,而且这个模式存在更多的缺陷。它的目的是为了让VStudio为新手提供智能感知帮助(当时我也是新手)。使用具有自定义类型的XSD会给你一个警告;然而,读取器不会验证,所以它可以正常工作。你可以使用自定义XSD,或者简单地忽略错误。 - csharptest.net

3

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

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

2

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

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


2

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

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


总之,以下是如何解决问题:

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

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


1
你尝试过使用单独的log4net.config文件吗?

1

我得到了一个测试 ASP 项目,按照上述方法将 XSD 文件放入 Visual Studio 模式文件夹中(对于我来说是 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接