web-dev-qa-db-fra.com

Dans Log4j2, comment associer un schéma XML à log4j2.xml?

J'ai essayé le nouveau Log4j2. Il semble, d'après la documentation sur la migration , que la spécification XML Schema/DTD a été supprimée.

Cela semble être un pas en arrière. Il devrait sûrement être possible d'associer un schéma XML ou une DTD à mon log4j2.xml pour aider à sa rédaction et pour validation. Je n'ai rien trouvé d'utile dans la documentation, et je n'ai pas non plus trouvé le schéma XML ou la DTD elle-même.

Donc: dans Log4j2, comment dois-je associer un schéma XML à log4j2.xml?

33
glts

Je ne pense pas qu'il soit possible d'avoir un schéma/DTD avec log4j2. Récemment, j'ai écrit un appender personnalisé et pour le soutenir, mon log4j2.xml ressemble à ça:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="ERROR" packages="package.same.as.custom.appender">
  <appenders>
    <CyclicBuffer name="CyclicBuffer" bufferSize="200">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c{1.} - %msg%n"/>
    </CyclicBuffer>
  </appenders>
  <loggers>
    <root level="info">
      <appender-ref ref="CyclicBuffer"/>
    </root>
  </loggers>
</configuration>

Les choses importantes à noter sont que j'ai un élément CyclicBuffer complètement personnalisé et qu'il a un attribut bufferSize complètement personnalisé. Jetez un œil à la documentation entourant @PluginFactory et @Plugin pour plus de détails.

En raison de cette personnalisation, je ne pense pas que le XML puisse être validé via un XSD/DTD standard standard. Au lieu de cela, je pense que vous devrez créer votre propre XSD si vous souhaitez valider le XML.

Une chose importante à noter, c'est que dans mon XML, j'ai: <configuration status="ERROR". Lorsqu'il est présent, log4j2 affichera toutes les erreurs associées à une configuration incorrecte au moment de l'exécution. Bien qu'elle ne soit pas aussi pratique que la validation XML, elle est également très utile!

J'espère que cela vous sera utile, Muel.

7
Muel

Veuillez relire la documentation Log4J2 sur configuration XML et vous trouverez ces 2 endroits:

Log4j peut être configuré à l'aide de deux versions XML; concis et strict . Le format concis facilite la configuration car les noms des éléments correspondent aux composants qu'ils représentent mais il ne peut pas être validé avec un Schéma XML . Par exemple, ConsoleAppender est configuré en déclarant un élément XML nommé Console sous son élément appenders parent. Cependant, les noms d'élément et d'attribut ne sont pas sensibles à la casse. De plus, les attributs peuvent être spécifiés comme un attribut XML ou comme un élément XML qui n'a aucun attribut et a une valeur de texte.

et un peu plus loin:

XML strict . En plus du format XML concis ci-dessus, Log4j permet de spécifier des configurations d'une manière XML plus "normale" qui peut être validée à l'aide d'un schéma XML . Ceci est accompli en remplaçant les noms d'éléments conviviaux ci-dessus par leur type d'objet comme indiqué ci-dessous. Par exemple, au lieu que ConsoleAppender soit configuré à l'aide d'un élément nommé Console, il est plutôt configuré en tant qu'élément appender avec un attribut de type contenant "Console".

Donc si vous souhaitez utiliser la validation de schéma XML pour Log4j2, utilisez uniquement le format XML strict .

17
glory1

Je n'arrive pas à trouver une référence au XSD sur le site Web de Log4J2, mais si vous téléchargez le for 2.0 beta 5, vous constaterez qu'il contient un schéma Log4J 2 (Log4J-V2.0.xsd) dans le chemin core/src/main/ressources.

Comme indiqué par Muel, il est tout à fait possible d'avoir des ajouts personnalisés. Pour cette raison, je pense que cela ne fonctionnerait que si vous utilisez strict = "true" dans le nœud de configuration principal.

Voir: http://logging.Apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax

J'ai utilisé l'attribut de schéma pour l'ajouter à la configuration et il semble fonctionner principalement.

Voici un exemple:

<configuration name="testConfiguration"
    status="debug"
    strict="true"
    monitorInterval="30"
    schema="Log4J-V2.0.xsd">

Je dis "principalement" parce qu'un problème que j'ai trouvé, c'est que même certains attributs valides documentés (par exemple, monitorInterval) manquent dans le XSD.

Avec un peu de chance, avec les versions futures, un XSD précis au format strict sera disponible.

J'espère que cela aidera.

-Steve

Mise à jour: Voir LOG4J2-17 concernant le problème de validation XSD

11
sfosdal

Fonctionne pour moi avec Eclipse:

<Configuration strict="true"
           xmlns="http://logging.Apache.org/log4j/2.0/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://logging.Apache.org/log4j/2.0/config 
           https://raw.githubusercontent.com/Apache/logging-log4j2/master/log4j-core/src/main/resources/Log4j-config.xsd">

ou contre la version balisée:

<Configuration strict="true"
           xmlns="http://logging.Apache.org/log4j/2.0/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://logging.Apache.org/log4j/2.0/config 
           https://raw.githubusercontent.com/Apache/logging-log4j2/log4j-2.8.2/log4j-core/src/main/resources/Log4j-config.xsd">
9
x545