【问题标题】:Log4Net "Could not find schema information" messagesLog4Net“找不到架构信息”消息
【发布时间】:2010-09-15 12:33:21
【问题描述】:

我决定使用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
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

nemo 已添加:

只是对任何人的警告 听从答案的建议 这个线程。有一种可能 使用 log4net 带来的安全风险 根目录下的 xml 配置 Web 服务的,因为它将是 默认情况下任何人都可以访问。只是 如果您的配置被告知 包含敏感数据,您可能需要 放在别的地方。


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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对于VS 2010,把上面提到的log4net XSD放到C:\Program Files\Microsoft Visual Studio 10.0\XML\Schemas。关闭并重新打开 VS。打开 .config 文件,进入菜单项 XML -> Schemas,点击 log4net.xsd 和“Use this Schema”
      【解决方案3】:

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

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

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

      【讨论】:

      • 虽然它对我有用,但在调试输出中它警告主配置文件中缺少部分。所以我不得不保留它们,但像这样&lt;log4net&gt;&lt;/log4net&gt; 让警告消失
      【解决方案4】:

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

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


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

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

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

      【讨论】:

        【解决方案5】:

        您可以在架构中绑定到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">
        

        【讨论】:

        • 很奇怪 log4net 不包含 XSD。
        • 实际上有一段时间没有尝试这个,我无法让它在 Visual Studio 2005 下工作。它工作得很好,但它仍然会引发有关所有 XML 元素的警告。跨度>
        • 此 XSD 抱怨使用自定义附加程序。它只允许来自默认集合(定义为枚举)的附加程序,而不是简单地将其设为字符串字段
        • 这很适合我的情况。我现在可以验证配置文件。谢谢。
        • @BenLaan Roger 提供的许可证允许您从他的 XSD 创建派生作品。只需复制他的 XSD 并将您的自定义附加程序添加到 部分。然后你可以把这个 XSD 文件放在你喜欢的任何地方,并从你的配置文件中引用它(而不是他的)。例如,xsi:noNamespaceSchemaLocation="myschemas\mylog4net.xsd"
        【解决方案6】:

        只是对任何遵循此线程中答案的建议的人提出警告。将 log4net 配置放在 web 服务根目录下的 xml 中可能存在安全风险,因为默认情况下任何人都可以访问它。请注意,如果您的配置包含敏感数据,您可能希望将其放在其他位置。

        【讨论】:

        • 更好的解决方案是使用.config 扩展而不是.xml。默认情况下,IIS 会阻止对 .configs 的请求
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            如上所述,我通过将 xsd 文件放在 Visual Studio 架构文件夹中(对我来说是 C:\Program Files\Microsoft Visual Studio 8\XML\Schemas),然后将我的 @ 987654321@看起来像这样:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                Roger's answer 中,他提供了一个架构,这对我来说非常有效,除了评论者提到的地方

                此 XSD 抱怨使用自定义附加程序。它只允许从默认集合(定义为枚举)中添加附加程序,而不是简单地将其设为字符串字段

                我修改了具有名为log4netAppenderTypesxs:simpletype 的原始架构并删除了枚举。相反,我将其限制为基本的 .NET 键入模式(我说基本是因为它只支持 typenametypename, 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>
                

                【讨论】:

                • 这实际上是设计使然,而且这种模式还有很多不足之处。它的目的是为 VStudio 提供一种为新手提供智能帮助的方法(就像我当时一样)。将 XSD 与自定义类型一起使用确实会给您一个警告;但是,读者没有验证,所以它会正常工作。您可以使用自定义 XSD,也可以直接忽略错误。
                【解决方案12】:

                我注意到它有点晚了,但是如果你查看 log4net 提供的示例,你会看到它们将所有配置数据放入 app.config 中,不同之处在于 configsection 的注册:

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

                将其定义为“System.Configuration.IgnoreSectionHandler”类型是否是 Visual Studio 未在 log4net 内容上显示任何警告/错误消息的原因?

                【讨论】:

                  【解决方案13】:

                  我关注了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*)?+)?"/>
                  

                  【讨论】:

                    猜你喜欢
                    • 2021-12-12
                    • 1970-01-01
                    • 2012-12-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-25
                    相关资源
                    最近更新 更多