62

我决定使用log4net作为新 Web 服务项目的记录器。一切正常,但是对于我在其中使用的每个 log4net 标签,我都会收到很多如下所示的消息web.config

找不到元素“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)]

尼莫补充说:

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


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

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

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

4

13 回答 13

76

您可以在模式中绑定到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">
于 2008-11-08T20:59:55.873 回答
17

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

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

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

于 2008-10-06T20:43:56.507 回答
11

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

于 2008-11-24T20:07:50.990 回答
5

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

于 2008-10-06T14:33:14.537 回答
4

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

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

我修改了具有xs:simpletype命名的原始模式log4netAppenderTypes并删除了枚举。相反,我将其限制为基本的 .NET 类型模式(我说基本是因为它只支持类型名称类型名称、程序集——但是有人可以扩展它。

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

<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>
于 2012-08-02T15:23:15.440 回答
3

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

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
于 2009-07-24T09:16:56.837 回答
2

@steve_mtl:更改文件扩展名.config.xml解决问题。谢谢你。

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


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

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

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

于 2008-10-07T07:37:57.543 回答
2

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

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

于 2008-12-12T07:39:24.190 回答
1

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

于 2008-10-06T14:21:32.423 回答
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>
于 2009-07-31T11:22:44.490 回答
0

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

于 2011-03-07T23:16:49.430 回答
0

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

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

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

于 2015-02-15T17:07:15.130 回答
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*)?+)?"/>
于 2017-03-02T18:09:57.280 回答