Log4Net“找不到架构信息”消息
Posted
技术标签:
【中文标题】Log4Net“找不到架构信息”消息【英文标题】:Log4Net "Could not find schema information" messages 【发布时间】: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>
已解决:
-
将每个 log4net 特定标签复制到单独的
xml
文件中。确保使用.xml
作为文件扩展名。
将以下行添加到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 的所有内容都放在该文件中,但我仍然收到相同的消息。
【问题讨论】:
【参考方案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,它帮助了我。
【讨论】:
虽然它对我有用,但在调试输出中它警告主配置文件中缺少部分。所以我不得不保留它们,但像这样<log4net></log4net>
让警告消失【参考方案4】:
@steve_mtl:将文件扩展名从.config
更改为.xml
解决了这个问题。谢谢。
@Wheelie:我无法尝试您的建议,因为我需要一个适用于未修改的 Visual Studio 安装的解决方案。
总结一下,解决问题的方法如下:
-
将每个 log4net 特定标签复制到单独的
xml
文件中。确保使用.xml
作为文件扩展名。
将以下行添加到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 并将您的自定义附加程序添加到只是对任何遵循此线程中答案的建议的人提出警告。将 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 抱怨使用自定义附加程序。它只允许从默认集合(定义为枚举)中添加附加程序,而不是简单地将其设为字符串字段
我修改了具有名为log4netAppenderTypes
的xs: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>
【讨论】:
这实际上是设计使然,而且这种模式还有很多不足之处。它的目的是为 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://***.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*)?+)?"/>
【讨论】:
以上是关于Log4Net“找不到架构信息”消息的主要内容,如果未能解决你的问题,请参考以下文章