Pergunta

Eu decidi usar log4net como um madeireiro para um novo projeto de serviço da web. Tudo está funcionando bem, mas recebo muitas mensagens como a abaixo, para cada tag de log4net que estou usando no meu web.config:

Não foi possível encontrar informações de esquema para o elemento 'log4net' ...

Abaixo estão as partes relevantes do meu 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>

Resolvido:

  1. Copie cada tag específica de log4net para um separado xml-Arquivo. Certifique -se de usar .xml como extensão de arquivo.
  2. Adicione a seguinte linha a AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "xmlFile.xml", Watch = true)]

Nemo adicionado:

Apenas uma palavra de aviso para qualquer pessoa segue os conselhos das respostas neste tópico. Existe um possível risco de segurança tendo a configuração do log4NET em um XML off the Root do Serviço da Web, pois será acessível a qualquer pessoa por padrão. Basta ser aconselhado se a sua configuração contiver dados confidenciais, convém colocá -los em outro lugar.


@WCM: tentei usar um arquivo separado. Eu adicionei a seguinte linha para AssemblyInfo.cs

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

E coloque tudo lidando com o log4net nesse arquivo, mas ainda recebo as mesmas mensagens.

Foi útil?

Solução

Eu tive uma tomada diferente e precisava da seguinte sintaxe:

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

que difere do último post do XSL, mas fez a diferença para mim. Veja isso Postagem do blog, isso me ajudou.

Outras dicas

Você pode vincular um esquema ao log4net elemento. Existem alguns flutuando, a maioria não fornece completamente as várias opções disponíveis. Eu criei o seguinte XSD para fornecer o máximo de verificação possível:http://csharptest.net/downloads/schema/log4net.xsd

Você pode ligá -lo ao XML facilmente modificando o log4net elemento:

<log4net 
     xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Apenas uma palavra de aviso para qualquer pessoa segue os conselhos das respostas neste tópico. Existe um possível risco de segurança tendo a configuração do log4NET em um XML off the Root do Serviço da Web, pois será acessível a qualquer pessoa por padrão. Basta ser aconselhado se a sua configuração contiver dados confidenciais, convém colocá -los em outro lugar.

Eu acredito que você está vendo a mensagem porque o Visual Studio não sabe como validar a seção log4net do arquivo de configuração. Você poderá corrigir isso copiando o log4net XSD em C: Arquivos de Programas Microsoft Visual Studio 8 XML Esquemas (ou onde quer que seu Visual Studio esteja instalado). Como um bônus adicional, agora você deve obter apoio do Intellisense ao log4net

Na verdade, você não precisa manter a extensão .xml. Você pode especificar qualquer outra extensão no atributo ConfigFileExtension:

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

@steve_mtl: alterando as extensões de arquivo de .config para .xml resolveu o problema. Obrigada.

@Wheelie: Não pude tentar sua sugestão, porque precisava de uma solução que funcione com uma instalação não modificada do Visual Studio.


Para resumir, eis como resolver o problema:

  1. Copie cada tag específica de log4net para um separado xml-Arquivo. Certifique -se de usar .xml como extensão de arquivo.
  2. Adicione a seguinte linha a AssemblyInfo.cs:

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

Para o VS2008, basta adicionar o arquivo log4net.xsd ao seu projeto; VS Looks na pasta do projeto, bem como no diretório de instalação que Wheelie mencionou.

Além disso, o uso de uma extensão .config em vez de .xml evita o problema de segurança, pois o IIS não serve *.config arquivos por padrão.

Dentro Resposta de Roger, onde ele forneceu um esquema, isso funcionou muito bem para mim, exceto onde um comentarista mencionou

Este XSD está reclamando do uso de apêndices personalizados. Ele permite apenas um appender do conjunto padrão (definido como enumeração) em vez de simplesmente fazer deste um campo de string

Eu modifiquei o esquema original que tinha um xs:simpletype nomeado log4netAppenderTypes e removeu as enumerações. Em vez disso, eu o restringi a um padrão básico de digitação .NET (eu digo básico porque ele apenas suporta Digite o nome apenas, ou Typename, Assembléia - No entanto, alguém pode estendê-lo.

Simplesmente substitua o log4netAppenderTypes Definição com o seguinte no 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>

Estou passando isso de volta ao autor original, se ele quiser incluí -lo em sua versão oficial. Até então, você teria que baixar e modificar o XSD e fazer referência a ele de maneira relativa, por exemplo:

<log4net
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../../../Dependencies/log4net/log4net.xsd">
  <!-- ... -->
</log4net>

Você já tentou usar um arquivo log4net.config separado?

Recebi um projeto de teste de teste para construir colocando o arquivo XSD na pasta Visual Studio Schemas, como descrito acima (para mim, é C: Arquivos de Programas Microsoft Visual Studio 8 XML Schemas) e, em seguida, fazendo meu web.config parece com isso:

<?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>

Sem modificar sua instalação do Visual Studio e levar em consideração a versão adequada/etc. Entre o restante da sua equipe, adicione o arquivo .xsd à sua solução (como um 'item da solução') ou se você o desejar apenas para um projeto específico, basta incorporá -lo lá.

Percebi um pouco tarde, mas se você olhar para os exemplos, o log4net fornece, poderá vê -los colocar todos os dados de configuração em um app.config, com uma diferença, o registro da configuração:

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

A definição poderia como "System.configuration.ignoresectionHandler" ser a razão pela qual o Visual Studio não mostra nenhuma mensagem de aviso/erro no material log4net?

eu segui KitResposta https://stackoverflow.com/a/11780781/6139051 E não funcionou para valores do AppenderType como "log4net.appender.traceappender, log4net". A montagem log4net.dll tem o conjunto de "log4net", ou seja, o nome da assembléia não tem um ponto dentro, foi por isso que o regex na resposta do kit não funcionou. Eu tenho que adicionar o ponto de interrogação após o terceiro grupo entre parênteses no Regexp e, depois disso, funcionou perfeitamente.

O regex modificado se parece com o seguinte:

<xs:pattern value="[A-Za-z_]\w*(\.[A-Za-z_]\w*)+(\s*,\s*[A-Za-z_]\w*(\.[A-Za-z_]\w*)?+)?"/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top