Сообщения Log4Net “Не удалось найти информацию о схеме”

StackOverflow https://stackoverflow.com/questions/174430

Вопрос

Я решил использовать 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)]

немо добавленный:

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


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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Вы можете привязать схему к 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">

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

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

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

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

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

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


Подводя итог, вот как решить эту проблему:

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

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

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

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

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

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

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

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

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

Я получил тестовый проект asp для сборки, поместив файл xsd в папку visual studio schemas, как описано выше (для меня это 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>

Без изменения вашей установки Visual Studio и с учетом надлежащего управления версиями / etc.вместе с остальными членами вашей команды добавьте файл .xsd в свое решение (как "Элемент решения"), или, если он вам нужен только для конкретного проекта, просто вставьте его туда.

Я заметил это немного поздно, но если вы посмотрите на примеры, которые предоставляет 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?

Я последовал за ним Комплектответ 's https://stackoverflow.com/a/11780781/6139051 и это не сработало для значений типа приложения, таких как "log4net.Appender.TraceAppender, log4net".log4net.dll Сборка имеет заголовок AssemblyTitle "log4net", т.е.в имени сборки нет точки внутри, вот почему регулярное выражение в ответе Кита не сработало.Я должен был добавить вопросительный знак после третьей группы в скобках в регулярном выражении, и после этого он работал безупречно.

Измененное регулярное выражение выглядит следующим образом:

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top