第 18 章 Maven Indexer 插件


Maven 插件需要 Maven Indexer 插件,以便它快速搜索 Maven Central 以查找工件。

要部署 Maven Indexer 插件,请使用以下命令:

先决条件

在部署 Maven Indexer 插件前,请确保已遵循在 Apache Karaf 上准备 使用 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 indexer 日志

部署 Maven Indexer 插件后,使用以下命令将其他外部 Maven 存储库添加到 Maven Indexer 插件配置中:

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

18.1. Log

Apache Karaf 提供动态、强大的日志记录系统。

它支持:

  • OSGi 日志服务
  • Apache Log4j v1 和 v2 框架
  • Apache Commons Logging 框架
  • Logback 框架
  • SLF4J 框架
  • 原生 Java Util Logging 框架

这意味着应用可以使用任何日志记录框架,Apache Karaf 将使用中央日志系统来管理日志记录器、附加程序等。

18.1.1. 配置文件

初始日志配置从 etc/org.ops4j.pax.logging.cfg 加载。

此文件是 标准 Log4j2 配置文件

找到不同的 Log4j2 元素:

  • loggers
  • appenders
  • 布局

您可以在 文件中直接添加自己的初始配置。

默认配置如下:

#
#  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 文件 appender 定义 ROOT 日志记录器,其 INFO 日志级别。您可以将日志级别更改为任何 Log4j2 有效值。从最详细到最详细的信息,您可以指定 TRACE, DEBUG, INFO, ERROR, 或 FATAL。

OSGi appender
osgi:* 附加程序是一个特殊的附加程序,用于将日志消息发送到 OSGi 日志服务。
stdout appender
stdout 控制台附加程序是预先配置的,但没有默认启用。此附加程序允许您在标准输出中直接显示日志消息。如果您计划在服务器模式下运行 Apache Karaf (不带控制台),这是值得注意的。

要启用它,您必须在 rootLogger 中添加 stdout 附加程序:

log4j2.rootLogger=INFO, out, stdout, osgi:*
out appender
out appender 是默认值。它是维护并轮转 10 1MB 日志文件的滚动文件。日志文件默认位于 data/log/fuse.log 中。
sift appender
默认情况下,sift appender 不会被启用。此附加器允许您为每个部署的捆绑包有一个日志文件。默认情况下,日志文件名称格式使用捆绑包符号名称(在 data/log 文件夹中)。您可以在运行时编辑此文件。Apache Karaf 重新加载文件,并且更改生效。您不需要重新启动 Apache Karaf。Apache Karaf 使用另一个配置文件,即 etc/org.apache.karaf.log.cfg。此文件配置由日志命令使用的日志服务(请参阅后文)。
jdbc appender
jdbc appender 有一个 lazy 标志,当 true (启用)时,如果数据源不可用,则不会将日志记录添加到数据库中。但是,当 jndi 时,数据源或连接会返回,日志会重启。
log4j2.appender.jdbc.cs.lazy = true
重要

如果要避免丢失日志记录消息,我们还会重新配置紧急附加程序。

18.1.2. 命令

Apache Karaf 不是更改 etc/org.ops4j.pax.logging.cfg 文件,而是提供一组命令来动态更改日志配置并查看日志内容:

18.1.2.1. log:clear

log:clear 命令清除日志条目。

18.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 are in red, DEBUG in purple, INFO in cyan 等。您可以使用 --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 用于日志消息等。

18.1.2.3. log:exception-display

log:exception-display 命令显示最后发生的异常。

对于 log:display 命令,log:exception-display 命令默认使用 rootLogger,但您可以使用 logger 参数指定 日志记录器

18.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 的别名。

18.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

18.1.2.6. log:set

log:set 命令设置日志记录器的日志级别。

默认情况下,它会更改 rootLogger 的日志级别:

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

您可以在 级别 后面使用 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 关键字的目的是删除日志记录器的当前级别(并且仅级别,其他属性(如 appender )不会被删除,以使用日志记录器父级级别(日志记录器是分级)。

例如,您定义了以下日志记录器(在 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

现在,如果我们将 DEFAULT 关键字与 my.logger 日志记录器一起使用:

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

我们有:

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

因此,my.logger.custommy.logger 使用父 rootLogger 的日志级别。

无法将 DEFAULT 关键字与 rootLogger 一起使用,且没有父项。

18.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。

18.1.3. JMX LogMBean

您可以使用 Log MBean 命令执行的所有操作。

LogMBean 对象名称是 org.apache.karaf:type=log,name iwl

18.1.3.1. 属性

  • level 属性是 ROOT 日志记录器的级别。

18.1.3.2. 操作

  • getLevel (logger) 以获取特定日志记录器的日志级别。由于此操作支持 ALL 关键字,它会返回一个带有各个日志记录器级别的 Map。
  • setLevel (level, logger),以设置特定日志记录器的日志级别。此操作支持 log:set 命令的 DEFAULT 关键字。

18.1.4. 高级配置

18.1.4.1. 过滤器

您可以将过滤器应用到附加程序。过滤器评估每个日志事件,并确定是否将其发送到日志。

Log4j2 提供可供使用过滤器使用。

注意

有关这些内容的综合视图,请参阅 Log4J 站点的 过滤器

18.1.4.2. 嵌套附加器

嵌套的附加程序是一个特殊的附加程序,您可以使用"inside"另一个附加程序。它允许您在附加器链之间创建某种类型的"routing"。

最常用的"嵌套合规"附加器是:

  • AsyncAppender (org.apache.log4j2.AsyncAppender)异步日志事件。此附加程序收集事件并将其分配给附加到它的所有附加者。
  • RewriteAppender (org.apache.log4j2.rewrite.RewriteAppender)在可能重写日志事件后将日志事件转发到另一个附加程序。

这个附加程序接受 appender 定义中的 appenders 属性:

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

18.1.4.3. 错误处理程序

有时,附加程序可能会失败。例如,RollingFileAppender 会尝试写入文件系统,但文件系统已满,或者 JMS 附加程序会尝试发送消息,但 JMS 代理不可用。

日志记录可能是关键的,因此务必要知道日志附加程序是否失败。

每个日志附加程序都可以将错误处理委托给错误处理程序,从而有机会对附加错误做出反应。

  • FailoverAppender (org.apache.log4j2.varia.FailoverAppender)允许次要附加程序在主附加程序失败时接管。错误消息会在 System.err 上打印,并记录在次要附加器中。
注意

有关 FailoverAppender 的更多信息,请访问 Log4j2 的 Apppender Page

您可以使用 appender 定义本身上的 errorhandler 属性定义要用于每个 appender 的错误处理程序:

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]

18.1.4.4. 特定于 OSGi 的 MDC 属性

sift appender 是一个面向 OSGi 的附加程序,允许您根据 MDC (Mapped Diagnostic Context)属性分割日志事件。

MDC 允许您区分不同的日志事件来源。

sift 附加程序默认提供面向 OSGi 的 MDC 属性:

  • bundle.id 是捆绑包 ID
  • bundle.name 是捆绑包符号名称
  • bundle.version 是捆绑包版本

您可以使用这些 MDC 属性为每个捆绑包创建日志文件:

#log4j2.rootLogger.appenderRef.Sift.ref = Routing

# Sift - MDC routing
#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.log}/bundle-\$\\\{ctx:bundle.name\}.log
#log4j2.appender.routing.routes.bundle.appender.filePattern = ${karaf.log}/bundle-\$\\\{ctx:bundle.name\}.log.%i
#log4j2.appender.routing.routes.bundle.appender.append = true
#log4j2.appender.routing.routes.bundle.appender.layout.type = PatternLayout
#log4j2.appender.routing.routes.bundle.appender.layout.pattern = ${log4j2.pattern}
#log4j2.appender.routing.routes.bundle.appender.policies.type = Policies
#log4j2.appender.routing.routes.bundle.appender.policies.size.type = SizeBasedTriggeringPolicy
#log4j2.appender.routing.routes.bundle.appender.policies.size.size = 8MB

18.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]

18.1.4.6. 自定义附加器

您可以在 Apache Karaf 中使用您自己的附加程序。

执行此操作的最简单方法是将您的附加程序打包为 OSGi 捆绑包,并将其附加为 org.ops4j.pax.logging.pax-logging-service 捆绑包的片段。

例如,您可以创建 MyAppender

public class MyAppender extends AppenderSkeleton {
...
}

您编译和打包为包含 MANIFEST 的 OSGi 捆绑包,如下所示:

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

在 Apache Karaf 系统 文件夹中复制您的捆绑包。系统 文件夹使用标准 Maven 目录布局:groupId/artifactId/version。

etc/startup.properties 配置文件中,您可以在 pax-logging-service 捆绑包前在列表中定义捆绑包。

您必须通过干净运行(提升 数据 文件夹)来重新启动 Apache Karaf,才能重新加载系统捆绑包。现在,您可以在 etc/org.ops4j.pax.logging.cfg 配置文件中直接使用您的 appender。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.