Сообщения Log4Net «Не удалось найти информацию о схеме» - PullRequest
56 голосов
/ 06 октября 2008

Я решил использовать log4net в качестве регистратора для нового проекта веб-сервиса. Все работает нормально, но я получаю много сообщений, как показано ниже, для каждого тега 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)]

nemo добавлено:

Просто предупреждение кому-либо следуйте советам ответов в эта тема. Есть возможность угроза безопасности при наличии log4net Конфигурация в XML от корня веб-службы, как это будет по умолчанию доступен любому. Просто посоветуйте, если ваша конфигурация содержит конфиденциальные данные, вы можете захотеть положить его где-нибудь еще.


@ wcm: я пытался использовать отдельный файл. Я добавил следующую строку к AssemblyInfo.cs

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

и помещаю в этот файл все, что касается log4net, но я все равно получаю те же сообщения.

Ответы [ 13 ]

68 голосов
/ 08 ноября 2008

Вы можете связать в схеме элемент log4net. Есть несколько плавающих вокруг, большинство не в полной мере обеспечивают различные доступные варианты. Я создал следующий xsd для максимально возможной проверки: http://csharptest.net/downloads/schema/log4net.xsd

Вы можете легко связать его с XML, изменив элемент log4net:

<log4net 
     xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
17 голосов
/ 07 октября 2008

У меня был другой дубль, и мне нужен следующий синтаксис:

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

, который отличается от последнего поста xsl, но изменил меня. Прочтите это сообщение в блоге , оно мне помогло.

9 голосов
/ 24 ноября 2008

Просто предупреждение всем, кто последует советам ответов в этой теме. Существует возможная угроза безопасности, если конфигурация log4net в xml находится вне корневого каталога веб-службы, поскольку она будет доступна любому по умолчанию. Имейте в виду, что если ваша конфигурация содержит конфиденциальные данные, вы можете поместить ее в другое место.

5 голосов
/ 06 октября 2008

Я полагаю, что вы видите сообщение, потому что Visual Studio не знает, как проверить раздел log4net файла конфигурации. Вы сможете исправить это, скопировав log4net XSD в C: \ Program Files \ Microsoft Visual Studio 8 \ XML \ Schemas (или там, где установлена ​​ваша Visual Studio). В качестве дополнительного бонуса вы теперь должны получить поддержку intellisense для log4net

3 голосов
/ 24 июля 2009

На самом деле вам не нужно придерживаться расширения .xml. Вы можете указать любое другое расширение в атрибуте ConfigFileExtension:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension=".config", Watch = true)]
2 голосов
/ 02 августа 2012

В ответе Роджера , где он предоставил схему, мне это очень помогло, за исключением случаев, когда комментатор упомянул

Этот XSD жалуется на использование пользовательских дополнений. Это позволяет только для appender из набора по умолчанию (определенного как enum), вместо того чтобы просто сделать это строковым полем

Я изменил исходную схему, которая имела xs:simpletype с именем log4netAppenderTypes, и удалил перечисления. Вместо этого я ограничил его базовым шаблоном печатания .NET (я говорю базовый, потому что он поддерживает только typename или typename, сборка - однако кто-то может его расширить.

Просто замените определение 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>

Я передаю это обратно первоначальному автору, если он хочет включить его в свою официальную версию. До этого вам придется загружать и изменять xsd и ссылаться на него относительным образом, например:

<log4net
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
  <!-- ... -->
</log4net>
2 голосов
/ 12 декабря 2008

Для VS2008 просто добавьте файл log4net.xsd в ваш проект; VS смотрит в папку проекта, а также в каталог установки, упомянутый Уилли.

Кроме того, использование расширения .config вместо .xml позволяет избежать проблемы безопасности, поскольку IIS по умолчанию не обслуживает файлы * .config.

2 голосов
/ 07 октября 2008

@ steve_mtl: Изменение расширений файлов с .config на .xml решило проблему. Спасибо.

@ Уилли: Я не смог опробовать ваше предложение, потому что мне нужно решение, которое работает с неизмененной установкой Visual Studio.


Чтобы подвести итог, вот как решить проблему:

  1. Скопируйте каждый тег log4net в отдельный xml -файл. Обязательно используйте .xml в качестве расширения файла.
  2. Добавить следующую строку в AssemblyInfo.cs:

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

1 голос
/ 31 июля 2009

Я получил тестовый проект 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>
1 голос
/ 06 октября 2008

Вы пытались использовать отдельный файл log4net.config?

...