2012-12-16 18 views
26

Ho dato il via al nuovo Log4j2. Sembra, dal documentation on migration, che lo schema XML/DTD sia stato eliminato.In Log4j2, come si associa uno schema XML con log4j2.xml?

Sembra un passo indietro. Sicuramente dovrebbe essere possibile associare uno schema XML o un DTD con il mio log4j2.xml per facilitare la scrittura e la convalida. Non sono stato in grado di trovare nulla di utile nella documentazione, né ho trovato lo schema XML o DTD stesso.

Quindi: in Log4j2, come dovrei associare uno schema XML con log4j2.xml?

+0

Se si vuole solo evitare per esempio Avvertenza di Eclipse per il file XML, dai un'occhiata a [risposta a "Nessun vincolo grammaticale (DTD o schema XML) rilevato per il documento"] (http://stackoverflow.com/a/27750701/828080) di @Pub . – fheub

+0

Si prega di dare un'occhiata a http://stackoverflow.com/a/10852980/592355. – xerx593

risposta

7

Non penso sia possibile avere uno schema/DTD con log4j2. Recentemente ho scritto un appender personalizzato, e per sostenere l'appender miei log4j2.xml si presenta così:

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

Le cose importanti da notare sono che ho un elemento completamente personalizzato CyclicBuffer, e che ha un completamente attributo personalizzato bufferSize. Dai un'occhiata alla documentazione che circonda @PluginFactory e @Plugin per maggiori dettagli.

A causa di questa personalizzazione, non penso che l'XML possa essere convalidato tramite un comune XSD/DTD comune. Invece, penso che dovrai creare il tuo XSD se vuoi convalidare l'XML.

Una cosa importante da notare, è che nel mio XML ho: <configuration status="ERROR". Quando questo è presente, log4j2 genererà tutti gli errori associati alla configurazione errata in fase di esecuzione. Anche se non è conveniente come la convalida XML, è anche molto utile!

Spero che questo sia di qualche aiuto, Muel.

+1

Vedo. Non sono nella posizione di criticare il design di Log4j2, ma ho pensato che il punto XML fosse che è facile da validare ... ma comunque, grazie! – glts

+0

È possibile che il formato non dinamico con '' funzioni anche: http://logging.apache.org/log4j/2.x/manual/configuration.html#Strict_XML; [glory1] (http://stackoverflow.com/a/19407812/253468) elaborato su questo 3 anni fa. – TWiStErRob

11

Non riesco a trovare un riferimento a XSD sul sito Web Log4J2, ma se scarichi il 2.0 beta 5, troverai che contiene uno schema Log4J 2 (Log4J-V2.0.xsd) nel percorso core/src/main/resources.

Come affermato da Muel, è possibile avere degli appendici personalizzati. Per questo motivo, credo che funzionerebbe solo se si utilizza strict = "true" nel nodo di configurazione principale.

See: http://logging.apache.org/log4j/2.x/manual/configuration.html#ConfigurationSyntax

Ho usato l'attributo dello schema di aggiungere questo per la configurazione e sembra funzionare per lo più.

Ecco un esempio:

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

Dico "per lo più", perché uno dei problemi che ho trovato che anche alcuni attributi validi documentati (per esempio monitorInterval) mancano dal XSD.

Speriamo che con le versioni future sia disponibile un XSD accurato del formato rigoroso.

Spero che questo sia di qualche aiuto.

-Steve

Aggiornato: Vedi LOG4J2-170 concernete una questione con la convalida XSD

+0

E 3,5 anni dopo tale problema rimane irrisolto. Questo è il motivo per cui non scegli le librerie basate sulla loro documentazione. – Dave

+0

@Dave che il problema è obsoleto, sì, ma il 99% è convalidato correttamente e si ottiene anche l'assistenza per i contenuti. L'XSD è sempre disponibile in 'log4j-core-2.6.2.jar/Log4j-config.xsd', puoi sempre copiarlo e aggiungere quell'attributo. – TWiStErRob

+0

Anche questo potrebbe essere utile: http://marxsoftware.blogspot.com/2016/08/log4j-2x-xsd-is-not-fully-descriptive.html – sfosdal

16

Si prega di rileggere la documentazione Log4J2 circa XML configuration e troverete questi 2 posti:

Log4j può essere configurato utilizzando due sapori XML; conciso e rigoroso. Il formato conciso semplifica la configurazione poiché i nomi degli elementi corrispondono ai componenti che rappresentano ma non possono essere convalidati con uno schema XML. Ad esempio, ConsoleAppender viene configurato dichiarando un elemento XML denominato Console sotto l'elemento appendici principale. Tuttavia, i nomi di elementi e attributi non sono case sensitive. Inoltre, gli attributi possono essere specificati come un attributo XML o come un elemento XML che non ha attributi e ha un valore di testo.

e un po 'più avanti:

XML Strict. Oltre al formato XML conciso sopra, Log4j consente di specificare le configurazioni in un modo XML più "normale" che può essere convalidato con uno schema XML utilizzando uno schema XML. Questo si ottiene rimpiazzando i nomi degli elementi amici sopra con il loro tipo di oggetto come mostrato sotto. Ad esempio, invece che ConsoleAppender viene configurato utilizzando un elemento denominato Console, viene configurato come elemento di un appender con un attributo type che contiene "Console".

Quindi , se si desidera utilizzare la convalida dello schema XML per Log4j2 quindi utilizzare solo il formato XML Strict.

+4

dov'è lo schema? – BrunoJCM

+0

@BrunoJCM 'log4j-core-2.6.2.jar/Log4j-config.xsd', ma lo uso in questo modo: ' ' – TWiStErRob

+1

Grazie, ma dopo aver capito che la modalità rigorosa non consente l'appender opzionale su Logger, ho rinunciato a questo .. – BrunoJCM

5

funziona per me con 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"> 

o contro versione tag:

<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"> 
+1

Nice :-) Piccolo suggerimento: Usa il tag per la versione di Log4j 2, ad esempio log4j-2.9-rc1, invece del ramo principale. Nel caso in cui l'XSD cambi: https://raw.githubusercontent.com/apache/logging-log4j2/log4j-2.9-rc1/log4j-core/src/main/resources/Log4j-config.xsd –