Menu Close

第19章 Maven Indexer プラグイン

Maven Indexer プラグインは、Maven プラグインがアーティファクトを Maven Central ですばやく検索できるようにするために必要です。

Maven Indexer プラグインをデプロイするには、以下のコマンドを使用します。

前提条件

Maven Indexer プラグインをデプロイする前に、『Installing on Apache Karaf』の「Preparing to Use Maven」の手順に従ったことを確認してください。

Maven Indexer プラグインのデプロイ

  1. Karaf コンソールに移動し、以下のコマンドを入力し、Maven Indexer プラグインをインストールします。

    features:install hawtio-maven-indexer
  2. 以下のコマンドを入力して Maven Indexer プラグインを設定します。

    config:edit io.hawt.maven.indexer
    config:proplist
    config:propset repositories 'https://maven.oracle.com'
    config:proplist
    config:update
  3. Maven Indexer プラグインがデプロイされるまで待ちます。これには数分かかる場合があります。ログタブに以下のようなメッセージが表示されるの確認します。

    Maven インデクサーログ

Maven Indexer プラグインがデプロイされたら、次のコマンドを使用して、Maven Indexer プラグイン設定に外部 Maven リポジトリーを追加します。

config:edit io.hawt.maven.indexer
config:proplist
config:propset repositories external repository
config:proplist
config:update

19.1. Log

Apache Karaf は、動的および強力なロギングシステムを提供します。

以下をサポートします。

  • OSGi Log Service
  • Apache Log4j v1 および v2 フレームワーク
  • Apache Commons Logging フレームワーク
  • Logback フレームワーク
  • SLF4J フレームワーク
  • ネイティブ Java Util Logging フレームワーク

これは、アプリケーションが任意のロギングフレームワークを使用できることを意味し、Apache Karaf は中央ログシステムを使用してロガー、アペンダーなどを管理します。

19.1.1. 設定ファイル

初期ログ設定は etc/org.ops4j.pax.logging.cfg からロードされます。

このファイルは、標準の Log4j2 設定ファイルです。

さまざまな log4j2 要素が見つかります。

  • ロガー
  • アペンダー
  • レイアウト

独自の初期設定をファイルに直接追加できます。

デフォルト設定は以下のとおりです。

#
#  Copyright 2005-2018 Red Hat, Inc.
#
#  Red Hat licenses this file to you under the Apache License, version
#  2.0 (the "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
#  implied.  See the License for the specific language governing
#  permissions and limitations under the License.
#

#
# Internal Log4j2 configuration
#
log4j2.status = WARN
log4j2.verbose = false
log4j2.dest = out

#
# Common pattern layouts for appenders defined as reusable properties
# See https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
# references will be replaced by felix.fileinstall
#
log4j2.pattern = %d{DEFAULT} | %-5.5p | %-20.20t | %-32.32c{1.} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
#log4j2.pattern = %d{DEFAULT} %-5.5p {%t} [%C.%M()] (%F:%L) : %m%n

#
# Appenders configuration
#

# JDBC Appender
log4j2.appender.jdbc.type = JDBC
log4j2.appender.jdbc.name = JdbcAppender
log4j2.appender.jdbc.tableName = EVENTS
log4j2.appender.jdbc.cs.type = DataSource
log4j2.appender.jdbc.cs.lazy = true
log4j2.appender.jdbc.cs.jndiName = osgi:service/jdbc/logdb
log4j2.appender.jdbc.c1.type = Column
log4j2.appender.jdbc.c1.name = DATE
log4j2.appender.jdbc.c1.isEventTimestamp = true
log4j2.appender.jdbc.c2.type = Column
log4j2.appender.jdbc.c2.name = LEVEL
log4j2.appender.jdbc.c2.pattern = %level
log4j2.appender.jdbc.c2.isUnicode = false
log4j2.appender.jdbc.c3.type = Column
log4j2.appender.jdbc.c3.name = SOURCE
log4j2.appender.jdbc.c3.pattern = %logger
log4j2.appender.jdbc.c3.isUnicode = false
log4j2.appender.jdbc.c4.type = Column
log4j2.appender.jdbc.c4.name = THREAD_ID
log4j2.appender.jdbc.c4.pattern = %thread
log4j2.appender.jdbc.c4.isUnicode = false
log4j2.appender.jdbc.c5.type = Column
log4j2.appender.jdbc.c5.name = MESSAGE
log4j2.appender.jdbc.c5.pattern = %message
log4j2.appender.jdbc.c5.isUnicode = false


# Console appender not used by default (see log4j2.rootLogger.appenderRefs)
log4j2.appender.console.type = Console
log4j2.appender.console.name = Console
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = ${log4j2.pattern}

# Rolling file appender
log4j2.appender.rolling.type = RollingRandomAccessFile
log4j2.appender.rolling.name = RollingFile
log4j2.appender.rolling.fileName = ${karaf.data}/log/fuse.log
log4j2.appender.rolling.filePattern = ${karaf.data}/log/fuse-%i.log.gz
# uncomment to not force a disk flush
#log4j2.appender.rolling.immediateFlush = false
log4j2.appender.rolling.append = true
log4j2.appender.rolling.layout.type = PatternLayout
log4j2.appender.rolling.layout.pattern = ${log4j2.pattern}
log4j2.appender.rolling.policies.type = Policies
log4j2.appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.rolling.policies.size.size = 16MB
log4j2.appender.rolling.strategy.type = DefaultRolloverStrategy
log4j2.appender.rolling.strategy.max = 20

# Audit file appender
log4j2.appender.audit.type = RollingRandomAccessFile
log4j2.appender.audit.name = AuditRollingFile
log4j2.appender.audit.fileName = ${karaf.data}/security/audit.log
log4j2.appender.audit.filePattern = ${karaf.data}/security/audit.log.%i
log4j2.appender.audit.append = true
log4j2.appender.audit.layout.type = PatternLayout
log4j2.appender.audit.layout.pattern = ${log4j2.pattern}
log4j2.appender.audit.policies.type = Policies
log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.audit.policies.size.size = 8MB

# OSGi appender
log4j2.appender.osgi.type = PaxOsgi
log4j2.appender.osgi.name = PaxOsgi
log4j2.appender.osgi.filter = *

#
# Loggers configuration
#

# Root logger
log4j2.rootLogger.level = INFO
log4j2.rootLogger.appenderRef.RollingFile.ref = RollingFile
log4j2.rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi
log4j2.rootLogger.appenderRef.Console.ref = Console
log4j2.rootLogger.appenderRef.Console.filter.threshold.type = ThresholdFilter
log4j2.rootLogger.appenderRef.Console.filter.threshold.level = ${karaf.log.console:-OFF}
#log4j2.rootLogger.appenderRef.Sift.ref = Routing

# Spifly logger
log4j2.logger.spifly.name = org.apache.aries.spifly
log4j2.logger.spifly.level = WARN

# Security audit logger
log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
log4j2.logger.audit.level = INFO
log4j2.logger.audit.additivity = false
log4j2.logger.audit.appenderRef.AuditRollingFile.ref = AuditRollingFile

# help with identification of maven-related problems with pax-url-aether
#log4j2.logger.aether.name = shaded.org.eclipse.aether
#log4j2.logger.aether.level = TRACE
#log4j2.logger.http-headers.name = shaded.org.apache.http.headers
#log4j2.logger.http-headers.level = DEBUG
#log4j2.logger.maven.name = org.ops4j.pax.url.mvn
#log4j2.logger.maven.level = TRACE

デフォルト設定は、out file アペンダーを使用して INFO ログレベルで ROOT ロガーを定義します。ログレベルを Log4j2 の有効な値に変更できます。最も詳細なログレベルの順に TRACE、DEBUG、INFO、ERROR、FATAL となり、これらを指定できます。

OSGi アペンダー
osgi:* アペンダーは、ログメッセージを OSGi Log Service に送信するための特別なアペンダーです。
stdout アペンダー
stdout コンソールアペンダーは事前設定されていますが、デフォルトでは有効化されていません。このアペンダーを使用すると、標準出力に直接ログメッセージを表示できます。Apache Karaf をサーバーモード (コンソールなし) で実行する予定の場合に有用です。

これを有効にするには、stdout アペンダーを rootLogger に追加する必要があります。

log4j2.rootLogger=INFO, out, stdout, osgi:*
out アペンダー
外部の アペンダーはデフォルトです。これは、10 個の 1MB ログファイルを維持およびローテーションするローリングファイルアペンーダです。ログファイルはデフォルトで data/log/fuse.log にあります。
sift アペンダー
sift アペンダーは、デフォルトでは有効になっていません。このアペンダーを使用すると、デプロイされたバンドルごとに 1 つのログファイルを指定できます。デフォルトでは、ログファイルの形式はバンドルシンボリック名( data/log フォルダー)を使用します。このファイルは実行時に編集できます。Apache Karaf はファイルをリロードし、変更が有効になります。Apache Karaf を再起動する必要はありません。別の設定ファイルは Apache Karaf(etc /org.apache.karaf.log.cfg )で使用されます。このファイルは、ログコマンドで使用されるログサービスを設定します (後で参照)。
jdbc アペンダー
jdbc アペンダーには lazy フラグがあり、データソースが利用できない場合には true有効)、ロギングはデータベースに追加されません。ただし、jndi、データソース、またはコネクションが復活すると、ロギングが再起動します。
log4j2.appender.jdbc.cs.lazy = true
重要

ロギングメッセージが失われないようにするには、緊急アペンダーを設定することをお勧めします。

19.1.2. コマンド

Apache Karaf は etc/org.ops4j.pax.logging.cfg ファイルを変更する代わりに、ログ設定を変更してログの内容を確認できる一連のコマンドを提供します。

19.1.2.1. log:clear

log:clear コマンドはログエントリーを消去します。

19.1.2.2. log:display

log:display コマンドは、ログエントリーを表示します。

デフォルトでは、rootLogger のログエントリーが表示されます。

karaf@root()> log:display
2015-07-01 19:12:46,208 | INFO  | FelixStartLevel  | SecurityUtils                    | 16 - org.apache.sshd.core - 0.12.0 | BouncyCastle not registered, using the default JCE provider
2015-07-01 19:12:47,368 | INFO  | FelixStartLevel  | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Starting JMX OSGi agent

logger 引数を使用して、特定のロガーからログエントリーを表示することもできます。

karaf@root()> log:display ssh
2015-07-01 19:12:46,208 | INFO  | FelixStartLevel  | SecurityUtils                    | 16 - org.apache.sshd.core - 0.12.0 | BouncyCastle not registered, using the default JCE provider

デフォルトでは、すべてのログエントリーが表示されます。Apache Karaf コンテナーが長時間稼働していると、非常に長くなる場合があります。-n オプションを使用して、表示するエントリーの数を制限できます。

karaf@root()> log:display -n 5
2015-07-01 06:53:24,143 | INFO  | JMX OSGi Agent   | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering org.osgi.jmx.framework.BundleStateMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.core:type=bundleState,version=1.7,framework=org.apache.felix.framework,uuid=5335370f-9dee-449f-9b1c-cabe74432ed1
2015-07-01 06:53:24,150 | INFO  | JMX OSGi Agent   | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering org.osgi.jmx.framework.PackageStateMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.core:type=packageState,version=1.5,framework=org.apache.felix.framework,uuid=5335370f-9dee-449f-9b1c-cabe74432ed1
2015-07-01 06:53:24,150 | INFO  | JMX OSGi Agent   | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering org.osgi.jmx.framework.ServiceStateMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.core:type=serviceState,version=1.7,framework=org.apache.felix.framework,uuid=5335370f-9dee-449f-9b1c-cabe74432ed1
2015-07-01 06:53:24,152 | INFO  | JMX OSGi Agent   | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering org.osgi.jmx.framework.wiring.BundleWiringStateMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.core:type=wiringState,version=1.1,framework=org.apache.felix.framework,uuid=5335370f-9dee-449f-9b1c-cabe74432ed1
2015-07-01 06:53:24,501 | INFO  | FelixStartLevel  | RegionsPersistenceImpl           | 78 - org.apache.karaf.region.persist - 4.0.0 | Loading region digraph persistence

etc/org.apache.karaf.log.cfg ファイルの size プロパティーを使用して、保存されたエントリー数を制限することもできます。

#
# The number of log statements to be displayed using log:display. It also defines the number
# of lines searched for exceptions using log:display exception. You can override this value
# at runtime using -n in log:display.
#
size = 500

デフォルトでは、各ログレベルは異なる色で表示されます。ERROR/FATAL は赤、DEBUG は紫、INFO は青緑などです。--no-color オプションを使用して、色を無効にすることができます。

ログエントリーの形式パターンは、etc /org.ops4j.pax.logging.cfg ファイルで定義された変換パターンを使用しません。デフォルトでは、etc /org.apache.karaf.log.cfg で定義された pattern プロパティーを使用します。

#
# The pattern used to format the log statement when using log:display. This pattern is according
# to the log4j2 layout. You can override this parameter at runtime using log:display with -p.
#
pattern = %d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

-p オプションを使用して、(実行 用に)パターンを動的に変更することもできます。

karaf@root()> log:display -p "\%d - \%c - \%m\%n"
2015-07-01 07:01:58,007 - org.apache.sshd.common.util.SecurityUtils - BouncyCastle not registered, using the default JCE provider
2015-07-01 07:01:58,725 - org.apache.aries.jmx.core - Starting JMX OSGi agent
2015-07-01 07:01:58,744 - org.apache.aries.jmx.core - Registering MBean with ObjectName [osgi.compendium:service=cm,version=1.3,framework=org.apache.felix.framework,uuid=6361fc65-8df4-4886-b0a6-479df2d61c83] for service with service.id [13]
2015-07-01 07:01:58,747 - org.apache.aries.jmx.core - Registering org.osgi.jmx.service.cm.ConfigurationAdminMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.compendium:service=cm,version=1.3,framework=org.apache.felix.framework,uuid=6361fc65-8df4-4886-b0a6-479df2d61c83

このパターンは、通常の Log4j2 パターンで、日付の %d、クラスの %c、ログメッセージの %m などのキーワードを使用できます。

19.1.2.3. log:exception-display

log:exception-display コマンドは、最後に発生した例外を表示します。

log:display コマンドの場合、log:exception-display コマンドはデフォルトでは rootLogger を使用しますが、logger 引数でロガー を指定できます。

19.1.2.4. log:get

log:get コマンドは、ロガーの現在のログレベルを表示します。

デフォルトでは、表示されるログレベルはルートロガーのログレベルです。

karaf@root()> log:get
Logger                              │ Level
────────────────────────────────────┼──────
ROOT                                │ INFO
org.apache.aries.spifly             │ WARN
org.apache.karaf.jaas.modules.audit │ INFO
org.apache.sshd                     │ INFO

logger 引数を使用して特定のロガーを指定できます。

karaf@root()> log:get ssh
INFO

logger 引数は、ALL キーワードを使用して、すべてのロガーのログレベルを表示します(リストとして)。

たとえば、以下のような独自のロガーを etc/org.ops4j.pax.logging.cfg ファイルに定義する場合:

log4j2.logger.my.name = MyLogger
log4j2.logger.my.level = DEBUG

対応するログレベルのロガーのリストが表示されます。

karaf@root()> log:get ALL
Logger                              │ Level
────────────────────────────────────┼──────
MyLogger                            │ DEBUG
ROOT                                │ INFO
org.apache.aries.spifly             │ WARN
org.apache.karaf.jaas.modules.audit │ INFO
org.apache.sshd                     │ INFO

log:list コマンドは log:get ALL のエイリアスです。

19.1.2.5. log:log

log:log コマンドを使用すると、ログに手動でメッセージを追加できます。Apache Karaf スクリプトを作成する場合に有用です。

karaf@root()> log:log "Hello World"
karaf@root()> log:display
12:55:21.706 INFO [pipe-log:log "Hello World"] Hello World

デフォルトでは、ログレベルは INFO ですが、- l オプションを使用して別のログレベルを指定できます。

karaf@root()> log:clear
karaf@root()> log:log -l ERROR "Hello World"
karaf@root()> log:display
12:55:41.460 ERROR [pipe-log:log "Hello World"] Hello World

19.1.2.6. log:set

log:set コマンドはロガーのログレベルを設定します。

デフォルトでは、ルートロガーのログレベルが変更されます

karaf@root()> log:set DEBUG
karaf@root()> log:get
Logger                              │ Level
────────────────────────────────────┼──────
ROOT                                │ DEBUG
...

レベル 1 の後に logger 引数を使用して、特定のロガーを指定できます。

karaf@root()> log:set INFO my.logger
karaf@root()> log:get my.logger
Logger    | Level
-----------------
my.logger | INFO

level 引数は、すべての Log4j2 ログレベル(TRACE、DEBUG、INFO、WARN、ERROR、FATAL)を受け入れます。

また、特殊な DEFAULT キーワードも受け入れます。

DEFAULT キーワードの目的は、ロガーの親のレベルを使用するために (ロガーは階層的です)、ロガーの現在のレベルを削除します (レベルのみが削除され、アペンダーなどの他のプロパティーは削除されません)。

たとえば、以下のロガーを定義しています(etc /org.ops4j.pax.logging.cfg ファイル内)。

rootLogger=INFO,out,osgi:*
my.logger=INFO,appender1
my.logger.custom=DEBUG,appender2

my.logger.custom ロガーのレベルを変更することができます。

karaf@root()> log:set INFO my.logger.custom

以下のようになります。

rootLogger=INFO,out,osgi:*
my.logger=INFO,appender1
my.logger.custom=INFO,appender2

my.logger.custom ロガーで DEFAULT キーワードを使用して、レベルを削除できます。

karaf@root()> log:set DEFAULT my.logger.custom

以下のようになります。

rootLogger=INFO,out,osgi:*
my.logger=INFO,appender1
my.logger.custom=appender2

つまり、起動時に my.logger.custom ロガーは親 my.logger のレベルを使用するため、INFO となります

my.logger ロガーで DEFAULT キーワードを使用する場合は、以下のようになります。

karaf@root()> log:set DEFAULT my.logger

以下のようになります。

rootLogger=INFO,out,osgi:*
my.logger=appender1
my.logger.custom=appender2

そのため、my.logger.custom および my.logger はいずれも親の rootLogger のログレベルを使用します。

rootLogger で DEFAULT キーワードを使用することはできず、親はありません。

19.1.2.7. log:tail

log:taillog:display と全く同じですが、ログエントリーが継続的に表示されます。

log:display コマンドと同じオプションと引数を使用できます。

デフォルトでは、rootLogger からのエントリーが表示されます。

karaf@root()> log:tail
2015-07-01 07:40:28,152 | INFO  | FelixStartLevel  | SecurityUtils                    | 16 - org.apache.sshd.core - 0.9.0 | BouncyCastle not registered, using the default JCE provider
2015-07-01 07:40:28,909 | INFO  | FelixStartLevel  | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Starting JMX OSGi agent
2015-07-01 07:40:28,928 | INFO  | FelixStartLevel  | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering MBean with ObjectName [osgi.compendium:service=cm,version=1.3,framework=org.apache.felix.framework,uuid=b44a44b7-41cd-498f-936d-3b12d7aafa7b] for service with service.id [13]
2015-07-01 07:40:28,936 | INFO  | JMX OSGi Agent   | core                             | 68 - org.apache.aries.jmx.core - 1.1.1 | Registering org.osgi.jmx.service.cm.ConfigurationAdminMBean to MBeanServer com.sun.jmx.mbeanserver.JmxMBeanServer@27cc75cb with name osgi.compendium:service=cm,version=1.3,framework=org.apache.felix.framework,uuid=b44a44b7-41cd-498f-936d-3b12d7aafa7b

log:tail コマンドから終了するには、CTRL-C と入力します。

19.1.3. JMX LogMBean

log:* コマンドで実行できるすべてのアクションは LogMBean を使用して実行できます。

LogMBean オブジェクト名は org.apache.karaf:type=log,name=* です。

19.1.3.1. 属性

  • level 属性は ROOT ロガー のレベル です。

19.1.3.2. 操作

  • 特定のロガーのログレベルを取得する getLevel(logger)この操作は ALL キーワードをサポートするため、各ロガーのレベルを持つ Map を返します。
  • 特定の ロガーのログレベルを設定する setLevel(level, logger)この操作は、log:set コマンドの DEFAULT キーワードをサポートします。

19.1.4. 詳細設定

19.1.4.1. フィルター

アペンダーにフィルターを適用できます。フィルターは各ログイベントを評価し、ログに送信するかどうかを決定します。

Log4j2 はすぐに使用できるフィルターを提供します。

注記

包括的なビューについては、Log4J サイトの「Filters」を参照してください。

19.1.4.2. ネストされたアペンダー

ネストされたアペンダーは、特別な種類のアペンダーで、「内部」の別のアペンダーを使用します。これにより、アペンダーのチェーン間にある種の「ルーティング」を作成できます。

最もよく使われる「ネスト準拠」アペンダーは次のとおりです。

  • AsyncAppender(org.apache.log4j2.AsyncAppender)はイベントを非同期に記録します。このアペンダーはイベントを収集し、それにアタッチされているすべてのアペンダーにそれらをディスパッチします。
  • RewriteAppender(org.apache.log4j2.rewrite.RewriteAppender)は、ログイベントを、ログイベントを書き換えた後に別のアペンダーに転送します。

この種類のアペンダーは、アペンダー定義のアペンダー プロパティーを受け入れます。

log4j2.appender.[appender-name].appenders=[comma-separated-list-of-appender-names]

たとえば、async という名前の AsyncAppender を作成し、ログイベントを JMS アペンダーに非同期にディスパッチできます。

log4j2.appender.async=org.apache.log4j2.AsyncAppender
log4j2.appender.async.appenders=jms

log4j2.appender.jms=org.apache.log4j2.net.JMSAppender
...

19.1.4.3. エラーハンドラー

アペンダーは失敗する場合があります。たとえば、RollingFileAppender はファイルシステムへの書き込みを試みますが、ファイルシステムが満杯になったり、JMS アペンダーはメッセージの送信を試みますが、JMS ブローカーは利用できません。

ロギングは重要なので、ログアペンダーが失敗したかどうかを知ることが重要です。

各ログアペンダーはエラー処理をエラーハンドラーに委譲できます。これは、アペンダーエラーに対応できます。

  • FailoverAppender(org.apache.log4j2.varia.FailoverAppender)を使用すると、プライマリーアペンダーが失敗すると、セカンダリーアペンダーが引き継ぎされます。エラーメッセージは System.err に出力され、セカンダリーアペンダーに記録されます。
注記

FailoverAppender の詳細は、Log4j2 の Apppender ページ を参照してください。

アペンダー定義の errorhandler プロパティーを使用して、各アペンダーに使用するエラーハンドラーを定義できます。

log4j2.appender.[appender-name].errorhandler=[error-handler-class]
log4j2.appender.[appender-name].errorhandler.root-ref=[true|false]
log4j2.appender.[appender-name].errorhandler.logger-ref=[logger-ref]
log4j2.appender.[appender-name].errorhandler.appender-ref=[appender-ref]

19.1.4.4. OSGi 固有の MDC 属性

ルーティング アペンダーは、OSGi 指向のアペンダーで、MDC(マッピング診断コンテキスト)属性に基づいてログイベントを分割できます。

MDC では、ログイベントのさまざまなソースを区別できます。

ルーティング アペンダーは、デフォルトで OSGi 指向 MDC 属性を提供します。

  • bundle.id はバンドル ID です。
  • bundle.name は、バンドルのシンボリック名です。
  • bundle.version はバンドルバージョンです。

これらの MDC プロパティーを使用して、バンドルごとにログファイルを作成できます。

log4j2.appender.routing.type = Routing
log4j2.appender.routing.name = Routing
log4j2.appender.routing.routes.type = Routes
log4j2.appender.routing.routes.pattern = $$\\{ctx:bundle.name\\}
log4j2.appender.routing.routes.bundle.type = Route
log4j2.appender.routing.routes.bundle.appender.type = RollingRandomAccessFile
log4j2.appender.routing.routes.bundle.appender.name = Bundle-$\\{ctx:bundle.name\}
log4j2.appender.routing.routes.bundle.appender.fileName = ${karaf.data}/log/bundle-$\\{ctx:bundle.name\\}.log
log4j2.appender.routing.routes.bundle.appender.filePattern = ${karaf.data}/log/bundle-$\\{ctx:bundle.name\\}.log.%d{yyyy-MM-dd}
log4j2.appender.routing.routes.bundle.appender.append = true
log4j2.appender.routing.routes.bundle.appender.layout.type = PatternLayout
log4j2.appender.routing.routes.bundle.appender.policies.type = Policies
log4j2.appender.routing.routes.bundle.appender.policies.time.type = TimeBasedTriggeringPolicy
log4j2.appender.routing.routes.bundle.appender.strategy.type = DefaultRolloverStrategy
log4j2.appender.routing.routes.bundle.appender.strategy.max = 31

log4j2.rootLogger.appenderRef.Routing.ref = Routing

19.1.4.5. OSGi スタックトレースレンダラーの拡張

デフォルトでは、Apache Karaf は特別なスタックトレースレンダラーを提供し、OSGi 固有の情報をいくつか追加します。

スタックトレースでは、例外を発生させるクラスに加えて、各スタックトレース行の最後に [id:name:version] パターンを検索します。

  • ID はバンドル ID です。
  • name はバンドル名です。
  • version はバンドルバージョンです。

問題の原因を診断するのに非常に役立ちます。

たとえば、以下の IllegalArgumentException スタックトレースでは、例外のソースに関する OSGi の詳細を確認できます。

java.lang.IllegalArgumentException: Command not found:  *:foo
	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:225)[21:org.apache.karaf.shell.console:4.0.0]
	at org.apache.felix.gogo.runtime.shell.Closure.executeStatement(Closure.java:162)[21:org.apache.karaf.shell.console:4.0.0]
	at org.apache.felix.gogo.runtime.shell.Pipe.run(Pipe.java:101)[21:org.apache.karaf.shell.console:4.0.0]
	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:79)[21:org.apache.karaf.shell.console:4.0.0]
	at org.apache.felix.gogo.runtime.shell.CommandSessionImpl.execute(CommandSessionImpl.java:71)[21:org.apache.karaf.shell.console:4.0.0]
	at org.apache.karaf.shell.console.jline.Console.run(Console.java:169)[21:org.apache.karaf.shell.console:4.0.0]
	at java.lang.Thread.run(Thread.java:637)[:1.7.0_21]

19.1.4.6. カスタムアペンダー

Apache Karaf では、独自のアペンダーを使用できます。

これを行う最も簡単な方法は、アペンダーを OSGi バンドルとしてパッケージ化し、org .ops4j.pax.logging.pax-logging-service バンドルのフラグメントとしてアタッチすることです。

たとえば、My Appender を作成します。

public class MyAppender extends AppenderSkeleton {
...
}

次のようなマニフェストを含む OSGi バンドルとしてコンパイルしてパッケージ化します。

Manifest:
Bundle-SymbolicName: org.mydomain.myappender
Fragment-Host: org.ops4j.pax.logging.pax-logging-service
...

Apache Karaf システム フォルダーでバンドルをコピーします。system フォルダーは、標準の Maven ディレクトリーレイアウトを使用します(groupId/artifactId/version)。

etc/startup.properties 設定ファイルで、pax-logging-service バンドルの前にバンドルを一覧に定義します。

システムバンドルをリロードするには、クリーンな実行( データ フォルダー)で Apache Karaf を再起動する必要があります。etc/org.ops4j.pax.logging.cfg 設定ファイルでアペンダーを直接使用できるようになりました。