web-dev-qa-db-ja.com

Log4j2では、XMLスキーマをlog4j2.xmlに関連付けるにはどうすればよいですか?

新しいLog4j2を試してみました。 移行に関するドキュメント から、XML Schema/DTD仕様が廃止されたようです。

それは一歩後ろのようです。確かに、XMLスキーマまたはDTDのいずれかをmy log4j2.xmlに関連付けて、記述と検証を支援することができるはずです。ドキュメントで役立つものを見つけることができず、XMLスキーマやDTD自体も見つかりませんでした。

So:Log4j2では、XMLスキーマをlog4j2.xmlに関連付けるにはどうすればよいですか?

33
glts

Log4j2でスキーマ/ DTDを使用することは不可能だと思います。最近、カスタムアペンダーを作成しました。アペンダーをサポートするために、log4j2.xmlは次のようになります。

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

注意すべき重要な点は、完全にカスタムのCyclicBuffer要素があり、完全にカスタムのbufferSize属性があることです。詳細については、@PluginFactoryおよび@Pluginに関するドキュメントをご覧ください。

このカスタマイズのため、XMLを標準の一般的なXSD/DTDで検証できるとは思いません。代わりに、XMLを検証する場合は、独自のXSDを作成する必要があると思います。

注意すべき重要な点の1つは、私のXMLには<configuration status="ERROR"があるということです。これが存在する場合、log4j2は実行時の不正な構成に関連するエラーを出力します。 XML検証ほど便利ではありませんが、非常に便利です!

Muelさん、これが何らかの助けになることを願っています。

7
Muel

XML configurationに関するLog4J2のドキュメントをもう一度読んでください。次の2つの場所が見つかります。

Log4jは、2つのXMLフレーバーを使用して構成できます。 簡潔および厳密簡潔な形式要素名がそれらが表すコンポーネントと一致するため、構成が非常に簡単になりますただし、XMLスキーマでは検証できません。たとえば、ConsoleAppenderは、その親のappenders要素の下にConsoleという名前のXML要素を宣言することによって構成されます。ただし、要素と属性の名前は大文字と小文字が区別されません。さらに、属性は、XML属性として、または属性がなくテキスト値を持つXML要素として指定できます。

そしてもう少し:

厳密なXML。上記の簡潔なXML形式に加えて、Log4jはXMLスキーマを使用して検証できるというより「通常の」XML方法で構成を指定できます。これは、以下に示すように、上記のフレンドリ要素名をオブジェクトタイプに置き換えることで実現されます。たとえば、Consoleという名前の要素を使用してConsoleAppenderを構成する代わりに、type属性が「Console」を含むアペンダー要素として構成します。

したがって、Log4j2にXMLスキーマ検証を使用する場合は、Strict XML形式のみを使用するです。

17
glory1

Log4J2 WebサイトでXSDへの参照を見つけることができないようですが、2.0ベータ5をダウンロードすると、パスcore/srcにLog4J 2スキーマ(Log4J-V2.0.xsd)が含まれていることがわかります。/main/resources。

ミュエルが述べたように、カスタムのアペンダーを持つことはかなり可能です。このため、メインの構成ノードでstrict = "true"を使用した場合にのみ機能すると思います。

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

これを設定に追加するためにスキーマ属性を使用しましたが、ほとんど機能しているようです。

次に例を示します。

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

「ほとんど」と言っているのは、文書化された有効な属性(monitorIntervalなど)の一部でもXSDから欠落しているという問題が1つ見つかったためです。

うまくいけば、将来のリリースで、厳密な形式の正確なXSDが利用可能になるでしょう。

これが何らかの助けになることを願っています。

-スティーブ

更新:XSD検証の問題について LOG4J2-17 を参照

11
sfosdal

私の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">

またはタグ付きバージョンに対して:

<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