hierarquia log4net e níveis de log

127

Este site diz

Os madeireiros podem ter níveis atribuídos. Níveis são instâncias da classe log4net.Core.Level. Os seguintes níveis são definidos em ordem crescente de prioridade :

  • TUDO
  • DEPURAR
  • INFO
  • ADVERTIR
  • ERRO
  • FATAL
  • FORA

DEBUG parece ter prioridade mais baixa e ERRO é maior.

Questão

  • Se eu definir o exemplo Mín e Máx, DEBUG e ERRO, ele imprimirá tudo DEBUG, INFO, WARN e ERROR. Sem uso de filtro mínimo e máximo. Se eu especificar ERROR (nível de log = ERROR), incluirá DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Em vez de filtro mínimo e máximo. É possível configurar um nível e incluir todos os outros níveis abaixo dele para registro.

Exemplo - Defina o nível como Erro, incluindo DEBUG, INFO, WARN e ERROR. Isso é possível com o log4net?

Postando a configuração do log4net com base em um dos comentários:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        </configSections >
        <log4net debug="true">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <layout type="log4net.Layout.XMLLayout" /> -->
        <param name="File" value="TestLog.log" />
        <param name="AppendToFile" value="false" />
        <layout type="log4net.Layout.PatternLayout">
            <header type="log4net.Util.PatternString" value="[START LOG] %newline" />
            <footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
            <conversionPattern value="%d [%t] %-5p - %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>
<root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="log4NetExample">
        <!-- <appender-ref ref="B" /> -->
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </logger>
</log4net>

Siva
fonte
você tentou definir o nível de log como INFO e verificou se ele inclui INFO e DEBUG?
Padrão
5
DEBUG parece ter a prioridade mais baixa e o erro é mais alto. Isso não é uma prioridade , mas um limite acima ou acima de uma mensagem será registrado.
R. Schreurs
Você já tentou usar apenas levelMax? Eu acho que isso deve incluir tudo abaixo dele, se você não especificar umlevelMin
AN

Respostas:

90

Isso pode ajudar a entender o que é registrado em que nível Os loggers podem ter níveis atribuídos. Níveis são instâncias da classe log4net.Core.Level. Os seguintes níveis são definidos em ordem crescente de gravidade - nível de log.

Número de níveis registrados para cada nível de configuração:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
All                        
DEBUG  DEBUG                  
INFO   INFO   INFO               
WARN   WARN   WARN   WARN           
ERROR  ERROR  ERROR  ERROR  ERROR      
FATAL  FATAL  FATAL  FATAL  FATAL  FATAL  
OFF    OFF    OFF    OFF    OFF    OFF    OFF
Mel Pama
fonte
2
Desculpe eu pensei que isso era wswg, por que não é ??
Mel Pama
1
Você pode dar uma olhada nesta parte do site para obter a formatação correta das respostas
Jarod Moser
36

Para a maioria dos aplicativos, você gostaria de definir um nível mínimo, mas não um nível máximo.

Por exemplo, ao depurar seu código, defina o nível mínimo como DEBUG e, em produção, defina-o como WARN.

Ilya Kogan
fonte
Por favor, verifique a minha pergunta atualizadas, Minha pergunta é para os níveis e declarações de registro
Siva
Mude <level value="ALL" /> para <level value="WARN" />e você receberá apenas os avisos e erros.
Ilya Kogan
2
Não, isso não ajuda. Eu tentei mudar. Não vi registros com prioridade abaixo incluída
Siva
12
Claro que você não verá os logs abaixo da prioridade. Essa é uma prioridade mínima que você está definindo.
Ilya Kogan
19

DEBUG mostrará todas as mensagens, INFO, além das mensagens DEBUG, e assim por diante.
Geralmente, usa-se INFO ou WARN. Isso depende da política da empresa.

Weismat
fonte
Por favor, verifique a minha pergunta atualizadas, Minha pergunta é para os níveis e declarações de registro
Siva
Publique toda a sua configuração do log4Net, você pode ter dois registradores que estão interferindo.
weismat
E eu pessoalmente usei apenas a configuração de nível até agora. Eu acho que as configurações Min / Max devem ser evitadas, se possível.
weismat
Eu publiquei toda a configuração log4net. Por favor, verifique. Estou tentando aprender e implementar.
Siva
16

Aqui está um código informando sobre a prioridade de todos os níveis do log4net:

TraceLevel(Level.All); //-2147483648

TraceLevel(Level.Verbose);   //  10 000
TraceLevel(Level.Finest);    //  10 000
    
TraceLevel(Level.Trace);     //  20 000
TraceLevel(Level.Finer);     //  20 000
    
TraceLevel(Level.Debug);     //  30 000
TraceLevel(Level.Fine);      //  30 000
    
TraceLevel(Level.Info);      //  40 000
TraceLevel(Level.Notice);    //  50 000
    
TraceLevel(Level.Warn);      //  60 000
TraceLevel(Level.Error);     //  70 000
TraceLevel(Level.Severe);    //  80 000
TraceLevel(Level.Critical);  //  90 000
TraceLevel(Level.Alert);     // 100 000
TraceLevel(Level.Fatal);     // 110 000
TraceLevel(Level.Emergency); // 120 000
    
TraceLevel(Level.Off); //2147483647


private static void TraceLevel(log4net.Core.Level level)
{
   Debug.WriteLine("{0} = {1}", level, level.Value);
}

Mohamed-ali MAAMAR
fonte
10

Como outros observaram, geralmente é preferível especificar um nível mínimo de log para registrar esse nível e quaisquer outros mais graves que ele. Parece que você está apenas pensando nos níveis de log para trás.

No entanto, se você quiser um controle mais refinado sobre o registro de níveis individuais, poderá dizer ao log4net para registrar apenas um ou mais níveis específicos usando a seguinte sintaxe:

<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="WARN"/>
</filter>

Ou para excluir um nível de log específico adicionando um nó "negar" ao filtro.

Você pode empilhar vários filtros juntos para especificar vários níveis. Por exemplo, se você deseja apenas os níveis WARN e FATAL. Se os níveis desejados forem consecutivos, o LevelRangeFilter é mais apropriado.

Documento de Referência: log4net.Filter.LevelMatchFilter

Se as outras respostas não fornecerem informações suficientes, espero que isso ajude você a obter o que deseja do log4net.

ulty4life
fonte
ah, negar é o que eu, pessoalmente, estava procurando. gostaria de informações + mensagens de erro, mas não depuração. obrigado por isso.
Sarfaraaz 1/11
by adding a "deny" node to the filtercomo?
Mrhotroad
@mrhotroad Não tenho certeza da diferença entre a versão atual do log4net e a versão de 2014, mas aqui está o documento sobre LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/... Assim você pode fazer <valor levelToMatch = "Avisar" AcceptOnMatch = "false" />
ulty4life
8

É verdade que a documentação oficial ( Apache log4net ™ Manual - Introdução ) afirma que existem os seguintes níveis ...

  • TUDO
  • DEPURAR
  • INFO
  • ADVERTIR
  • ERRO
  • FATAL
  • FORA

... mas estranhamente quando visualizo o conjunto log4net.dll, a classe selada v1.2.15.0 log4net.Core.Level vejo os seguintes níveis definidos ...

public static readonly Level Alert;
public static readonly Level All;
public static readonly Level Critical;
public static readonly Level Debug;
public static readonly Level Emergency;
public static readonly Level Error;
public static readonly Level Fatal;
public static readonly Level Fine;
public static readonly Level Finer;
public static readonly Level Finest;
public static readonly Level Info;
public static readonly Level Log4Net_Debug;
public static readonly Level Notice;
public static readonly Level Off;
public static readonly Level Severe;
public static readonly Level Trace;
public static readonly Level Verbose;
public static readonly Level Warn;

Uso o TRACE em conjunto com PostSharp OnBoundaryEntry e OnBoundaryExit há muito tempo. Eu me pergunto por que esses outros níveis não estão na documentação. Além disso, qual é a verdadeira prioridade de todos esses níveis?

barrypicker
fonte
2
Pelo que vale, todos estão listados no link a seguir, mas não atualizam seus manuais há um tempo. logging.apache.org/log4net/release/sdk/html/…
Dinerdo
2
Nível Fino; Nível mais fino; Nível melhor; Só vou usar esses três a partir de agora.
maembe 20/05/19
-3

Tente assim, funcionou para mim

<root>
  <!--<level value="ALL" />-->
  <level value="ERROR" />
  <level value="INFO" />
  <level value="WARN" />     
</root>

Isso registra três tipos de erros - erro, informações e aviso

Dhananjay
fonte
7
De acordo com os documentos da log4net para o Root Logger: "nível: elemento opcional, máximo de um permitido . Define o nível de registro para esse criador de logs. Este criador de log aceita apenas eventos que estão nesse nível ou acima. "
gonadarian
Por que esta resposta deu voto negativo? Está funcionando para mim também. Daí a votação.
amilamad 27/03/19
1
Porque <level value = "WARN" /> teria sido suficiente.
Rlesias 17/04/19