2008-10-06 5 views
53

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


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

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

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

ответ

17

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

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

, который отличается от последнего поста Xsl, но сделал разницу для меня. Проверьте это blog post, это помогло мне.

+0

Пока он работал для меня, в Debug Output он предупреждал о недостающих разделах в основном файле конфигурации. Поэтому я должен был оставить их пустыми, как это ``, чтобы исчезнуть предупреждение – 2011-01-06 18:58:06

1

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

5

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

+0

Это не работает для меня. – 2008-12-02 16:31:43

+4

Для VS 2010 поместите упомянутый выше log4net XSD в C: \ Program Files \ Microsoft Visual Studio 10.0 \ XML \ Schemas. Закрыть и снова открыть VS. Откройте файл .config, перейдите в пункт меню XML -> Схемы, нажмите на log4net.xsd и «Использовать эту схему» – 2011-01-05 20:02:06

+0

@PeterM. это сработало для меня. Берри Ницца! – IbrarMumtaz 2015-06-06 08:39:37

2

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

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


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

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

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

67

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

Очень странно, что log4net не включает XSD. – 2008-11-24 20:11:21

8

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

2

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

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

3

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

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

я получил тестовый жерех проект по строительству на кладя файл 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> 
0

Без модифицируя Визуальные установки Studio, а также принять во внимание соответствующие версионностей/и т.д.. среди остальной части вашей команды добавьте файл .xsd в свое решение (как «элемент решения»), или если вы хотите только его для конкретного проекта, просто вставьте его туда.

2

В Roger's answer, где он представил схему, это сработало очень хорошо для меня, кроме случаев, когда комментатор упомянул

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

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

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

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

0

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

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

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/> 

 Смежные вопросы

  • Нет связанных вопросов^_^