web-dev-qa-db-fra.com

Log4j - explication du concept de valeur de priorité et de nom de paramètre

Ma log4j.xml:

 <appender name="B2BAPP" class="org.Apache.log4j.RollingFileAppender">
     <param name="File" value="/LOGS/SAM/B2B_VJ.log"/>   
     <param name="Threshold" value="ERROR"/> 
     <param name="MaxFileSize" value="10000KB"/>
     <param name="MaxBackupIndex" value="10"/>
     <param name="Append" value="false"/>
     <layout class="org.Apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} %5p [%c:%L] %m%n"/>
     </layout>      
</appender>

<logger name="com.sas">    
   <priority value="DEBUG"/>
   <appender-ref ref="B2BAPP"/>
</logger>

Je voudrais comprendre le comportement de valeur prioritaire = "DEBUG" et param name = "Threshold" value = "DEBUG".

Dans mon enregistreur (com.sas) J'ai défini la valeur de priorité "DEBUG" et l'appender de cet enregistreur est "B2BAPP" et dans "B2BAPP" j'ai défini "Threshold" comme "ERROR".

Donc, le niveau de journalisation pour "com.sas" serait défini sur "DEBUG" ou "ERROR"?

Cas:

valeur prioritaire = "DEBUG" et param name = "Threshold" value = "ERROR"

valeur de priorité = "ERREUR" et nom de paramètre = "Seuil" valeur = "DEBUG"

Quelle serait la sortie des cas ci-dessus? Comment ça marche?

22
VJS

Le composant Logger accepte les instructions de journalisation (appels logger.debug(), logger.error() etc) et les envoie aux destinations appropriées aux Appenders.

Vous pouvez définir une "priorité" sur le Logger et lui demander d'accepter uniquement les instructions de journalisation d'un certain niveau. Les niveaux sont (par ordre d'importance croissante): TRACE, DEBUG, INFO, WARN, ERROR et FATAL.

Une configuration comme celle-ci:

<logger name="com.sas">
    <priority value="WARN" />
    ....
</logger>

charge le com.sas enregistreur pour accepter uniquement les niveaux avec un niveau d'importance de WARN ou supérieur (c'est-à-dire WARN, ERROR et FATAL).

Les instructions de journalisation sont ensuite envoyées à Appenders. Les appenders peuvent également être configurés pour n'accepter que les déclarations d'un certain niveau d'importance, une au-dessus d'un certain "seuil".

Une configuration comme:

<appender name="B2BAPP" class="org.Apache.log4j.RollingFileAppender">
   <param name="Threshold" value="ERROR"/> 
   ....
</appender>

indique à l'appelant d'accepter uniquement les déclarations d'importance ERREUR ou supérieures (c'est-à-dire ERREUR et FATAL).

Donc, le niveau de journalisation pour "com.sas" serait défini sur "DEBUG" ou "ERROR"?

Dans votre exemple, le niveau de journalisation est défini sur DEBUG. Ce qui est écrit par les annexes est orthogonal au problème.

Quant à vos deux exemples:

valeur prioritaire = "DEBUG" et param name = "Threshold" value = "ERROR"

valeur de priorité = "ERREUR" et nom de paramètre = "Seuil" valeur = "DEBUG"

1. La priorité de l'enregistreur définie sur DEBUG et le seuil de l'appender défini sur ERROR signifie que l'enregistreur passe le long de DEBUG, INFO, WARN, ERROR et FATAL mais l'appender accepte uniquement ERROR et FATAL pour que vous n'obteniez que ERROR et FATAL dans votre journal.

2. La priorité de l'enregistreur réglée sur ERREUR et le seuil de l'appendeur réglé sur DEBUG signifie que l'enregistreur transmet uniquement ERREUR et FATAL tandis que l'appendeur accepte DEBUG, INFO, WARN, ERROR et FATAL. Vous obtenez à nouveau seulement ERREUR et FATAL dans votre journal.

Mais ce n'est qu'un cas malheureux. Mélanger la priorité et le seuil peut vous offrir des fonctionnalités intéressantes. Par exemple...

... supposons que vous venez de placer une application en staging et que vous devez la surveiller un peu jusqu'à ce que vous la déplaciez en production. Un développeur et un administrateur système effectuent la surveillance. Alors que le développeur souhaite tous les journaux, l'administrateur système est occupé et ne souhaite voir que les erreurs.

Comment configurez-vous cela? Que diriez-vous quelque chose comme ça:

<appender name="developerLogs" class="org.Apache.log4j.RollingFileAppender">
    <param name="File" value="/LOGS/SAM/developerLogs.log" />
    <param name="Threshold" value="DEBUG" />
    <param name="Append" value="false" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
    </layout>
</appender>

<appender name="sysAdminLogs" class="org.Apache.log4j.RollingFileAppender">
    <param name="File" value="/LOGS/SAM/sysAdminLogs.log" />
    <param name="Threshold" value="ERROR" />
    <param name="Append" value="false" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
    </layout>
</appender>

<logger name="com.test">
    <priority value="DEBUG" />
    <appender-ref ref="developerLogs" />
    <appender-ref ref="sysAdminLogs" />
</logger>

Si vous exécutez du code comme:

Logger logger = Logger.getLogger("com.test");

logger.debug("some debug statement");
logger.info("some info statement");
logger.warn("some warn statement");
logger.error("some error statement");
logger.fatal("some fatal statement");

vous obtenez ceci dans sysAdminLogs.log:

some error statement
some fatal statement

et cela dans developerLogs.log:

some debug statement
some info statement
some warn statement
some error statement
some fatal statement

J'espère que cette explication décrit mieux les concepts.

56
Bogdan