19장. Maven Indexer 플러그인


Maven 플러그인에서 Maven Central이 아티팩트를 빠르게 검색할 수 있도록 하려면 Maven 플러그인에 필요합니다.

Maven Indexer 플러그인을 배포하려면 다음 명령을 사용합니다.

사전 요구 사항

Maven Indexer 플러그인을 배포하기 전에 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 로그 서비스
  • Apache Log4j v1 및 v2 프레임워크
  • Apache Commons Logging 프레임워크
  • 로그백 프레임워크
  • SLF4J 프레임워크
  • 네이티브 Java Util Logging 프레임워크

즉, 애플리케이션에서 모든 로깅 프레임워크를 사용할 수 있으며 Apache Karaf는 중앙 로그 시스템을 사용하여 로거, appenders 등을 관리합니다.

19.1.1. 구성 파일

초기 로그 구성이 etc/org.ops4j.pax.logging.cfg 에서 로드됩니다.

이 파일은 표준 Log4j2 구성 파일입니다.

다양한 Log4j2 요소가 있습니다.

  • 로거
  • appender
  • 레이아웃

파일에 직접 고유한 초기 구성을 추가할 수 있습니다.

기본 구성은 다음과 같습니다.

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

기본 구성은 파일 appender를 사용하여 INFO 로그 수준으로 ROOT 로거를 정의합니다. 로그 수준을 Log4j2 유효한 값으로 변경할 수 있습니다. 가장 상세 정보에서 최소 상세 정보까지 TRACE, DEBUG, INFO, ERROR 또는 FATAL을 지정할 수 있습니다.

OSGi appender
osgi:* appender는 로그 메시지를 OSGi 로그 서비스로 보내는 특수 appender입니다.
stdout appender
stdout 콘솔 appender는 사전 구성되었지만 기본적으로 활성화되어 있지 않습니다. 이 appender를 사용하면 로그 메시지를 표준 출력에 직접 표시할 수 있습니다. Apache Karaf를 서버 모드에서 실행하려는 경우 콘솔 없이 유용할 수 있습니다.

이를 활성화하려면 stdout appender를 rootLogger 에 추가해야 합니다.

log4j2.rootLogger=INFO, out, stdout, osgi:*
out appender
out appender는 기본 항목입니다. 10 1MB 로그 파일을 유지 관리하고 순환하는 롤링 파일 appender입니다. 로그 파일은 기본적으로 data/log/fuse.log 에 있습니다.
Sift appender
sift appender 는 기본적으로 활성화되어 있지 않습니다. 이 appender를 사용하면 배포된 번들당 하나의 로그 파일을 사용할 수 있습니다. 기본적으로 로그 파일 이름 형식은 번들 심볼릭 이름( 데이터/로그 폴더)을 사용합니다. 런타임 시 이 파일을 편집할 수 있습니다. 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
중요

로깅 메시지가 손실되지 않도록 하려면 긴급 추가 기능도 다시 구성하는 것이 좋습니다.

19.1.2. 명령

etc/org.ops4j.pax.logging.cfg 파일을 변경하는 대신 Apache Karaf는 로그 구성을 동적으로 변경하고 로그 콘텐츠를 볼 수 있는 명령 세트를 제공합니다.

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

로거 인수를 사용하여 특정 로거의 로그 항목을 표시할 수도 있습니다.

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

패턴은 날짜에 %d, 클래스의 %c, 로그 메시지의 경우 %m과 같은 키워드를 사용할 수 있는 일반 Log4j2 패턴입니다.

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

로거 인수를 사용하여 특정 로거 를 지정할 수 있습니다.

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 명령은 로거의 로그 수준을 설정합니다.

기본적으로 rootLogger 의 로그 수준을 변경합니다.

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

수준 1 뒤에 로거 인수를 사용하여 특정 로거 를 지정할 수 있습니다.

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 임을 의미합니다.

이제 my.logger 로거와 함께 DEFAULT 키워드를 사용하는 경우:

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

Red Hat은 다음과 같습니다.

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

따라서 my.logger.custommy.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. Cryostat LogMBean

log:* 명령으로 수행할 수 있는 모든 작업은 LogMBean을 사용하여 수행할 수 있습니다.

LogMBean 오브젝트 이름은 org.apache.karaf:type=log,name=* 입니다.

19.1.3.1. 속성

  • level 속성은 루트 로거의 수준입니다.

19.1.3.2. 작업

  • getLevel(logger) - 특정 로거의 로그 수준을 가져옵니다. 이 작업은 ALL 키워드를 지원하므로 각 로거의 수준이 포함된 맵을 반환합니다.
  • setLevel(level, logger) 을 설정하여 특정 로거의 로그 수준을 설정합니다. 이 작업은 log:set 명령에 대해 DEFAULT 키워드를 지원합니다.

19.1.4. 고급 구성

19.1.4.1. SIFT 로깅

Fuse-Karaf는 Log4j2 sift appender의 샘플(기본적으로 설명) 구성과 $FUSE_HOME/etc/org.ops4j.pax.logging.cfg 파일에서 이 appender를 사용하는 로거를 제공합니다.

# Sift appender
log4j2.appender.mdc.type = Routing
log4j2.appender.mdc.name = SiftAppender
log4j2.appender.mdc.routes.type = Routes
# see: http://logging.apache.org/log4j/2.x/manual/appenders.html#Routes
log4j2.appender.mdc.routes.pattern = $\\{ctx:bundle.name}
log4j2.appender.mdc.routes.sift.type = Route
log4j2.appender.mdc.routes.sift.appender.type = RollingRandomAccessFile
log4j2.appender.mdc.routes.sift.appender.name = RollingFile
log4j2.appender.mdc.routes.sift.appender.fileName = ${karaf.data}/log/sift-$\\{ctx:bundle.name}.log
log4j2.appender.mdc.routes.sift.appender.filePattern = ${karaf.data}/log/sift-$\\{ctx:bundle.name}-%i.log.gz
log4j2.appender.mdc.routes.sift.appender.append = true
log4j2.appender.mdc.routes.sift.appender.layout.type = PatternLayout
log4j2.appender.mdc.routes.sift.appender.layout.pattern = ${log4j2.pattern}
log4j2.appender.mdc.routes.sift.appender.policies.type = Policies
log4j2.appender.mdc.routes.sift.appender.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.mdc.routes.sift.appender.policies.size.size = 16MB
log4j2.appender.mdc.routes.sift.appender.strategy.type = DefaultRolloverStrategy
log4j2.appender.mdc.routes.sift.appender.strategy.max = 20
...
# sample logger using Sift appender
#log4j2.logger.example.name = org.apache.camel
#log4j2.logger.example.level = INFO
#log4j2.logger.example.appenderRef.SiftAppender.ref = SiftAppender

구성은 http://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender에 설명되어 있습니다.

SIFT/Routing appender의 pattern 속성은 로깅의 대상 위치를 구분하는 데 사용할 수 있는 것입니다.

다음은 다양한 조회를 사용할 수 있으며 여기에 설명되어 있습니다. http://logging.apache.org/log4j/2.x/manual/lookups.html

가장 중요한 조회는 ThreadContext 맵(.k.a)에서 값(keys)을 조회하는 ctx 입니다. MDC).

Fuse Karaf에서 제공하는 기본 구성은 ctx:bundle.name을 패턴으로 사용합니다. 즉, 다음과 같습니다.

lookup bundle.name key in MDC

bundle. 접두사가 지정된 키는 pax-logging 자체에서 제공하며 다음 3가지 값 중에서 선택할 수 있습니다.

  • bundle.name == org.osgi.framework.Bundle.getSymbolicName()
  • bundle.id == org.osgi.framework.Bundle.getBundleId()
  • bundle.version == org.osgi.framework.Bundle.getVersion().toString()

그러나 다음을 사용하여 MDC 지원을 통해 Camel 컨텍스트가 생성되는 경우(파란트 XML DSL).

<camelContext id="my-context" xmlns="http://camel.apache.org/schema/blueprint" useMDCLogging="true">

MDC/ThreadContext에서 사용할 수 있는 더 많은 키가 있으며 SIFT appender 구성에서 패턴으로 사용할 수 있습니다.

  • camel.exchangeId - The exchange id
  • Camel.messageId - 메시지 ID
  • Camel.correlationId - 상관 관계가 있는 경우 교환의 상관관계 ID입니다. 예를 들어 Splitter EIP에서 하위 메시지
  • Camel. CryostatKey - 트랜잭션된 교환에 대한 트랜잭션 ID입니다. id는 고유하지 않지만 지정된 트랜잭션의 트랜잭션 경계를 표시하는 트랜잭션 템플릿의 ID입니다. 따라서 이 사실을 가리키기 위해 TransactionID가 아닌 키의 이름을 지정했습니다.
  • Camel.routeId - 교환이 현재 라우팅되고 있는 경로의 ID
  • Camel.breadcrumbId - 전송 간 메시지를 추적하는 데 사용되는 고유 ID입니다.
  • Camel.contextId - 다른 카멜 컨텍스트의 메시지를 추적하는 데 사용되는 camel 컨텍스트 ID입니다.

https://people.apache.org/~dkulp/camel/mdc-logging.html에서 참조하십시오.

예를 들어 로깅 대상 파일을 Camel의 경로 ID로 구분하려면 다음을 사용하십시오.

log4j2.appender.mdc.routes.pattern = $\\{ctx:camel.routeId}
...
log4j2.appender.mdc.routes.sift.appender.fileName = ${karaf.data}/log/sift-$\\{ctx:camel.routeId}.log
log4j2.appender.mdc.routes.sift.appender.filePattern = ${karaf.data}/log/sift-$\\{ctx:camel.routeId}-%i.log.gz

한 가지 더 - 추가 구성만으로는 충분하지 않습니다. 일부 로거에 연결해야 합니다. 다시 한 번 샘플 구성에는 다음이 포함됩니다.

# sample logger using Sift appender
#log4j2.logger.example.name = org.apache.camel
#log4j2.logger.example.level = INFO
#log4j2.logger.example.appenderRef.SiftAppender.ref = SiftAppender

( log4j2.logger.example.appenderRef.SiftAppender.ref 속성의 SiftAppender 값은 appender 구성의 log4j2.appender.mdc.name 값과 일치해야 합니다).

여기서 org.apache.camel은 로거 이름(또는 카테고리 이름)입니다. 이는 Camel의 로그에 사용되는 끝점과 정확히 동일합니다. If you have (in Camel route):

<to uri="log:org.apache.camel" />

로깅이 작동했습니다.

다른 작업 구성은 다음과 같습니다.

<to uri="log:my-special-logger" />

및 다음을 수행합니다.

log4j2.logger.example.name = my-special-logger
log4j2.logger.example.level = DEBUG
log4j2.logger.example.appenderRef.SiftAppender.ref = SiftAppender

19.1.4.2. 필터

appender에 필터를 적용할 수 있습니다. 필터는 각 로그 이벤트를 평가하고 로그로 보낼지 여부를 결정합니다.

Log4j2는 필터를 사용할 준비가 되어 있습니다.

참고

이에 대한 포괄적인 보기는 Log4J 사이트의 필터 를 참조하십시오.

19.1.4.3. 중첩된 appender

중첩된 appender는 다른 appender를 "내부"하는 특수한 종류의 appender입니다. 이를 통해 appender 체인 사이에 일종의 "라우팅"을 생성할 수 있습니다.

가장 많이 사용되는 "nested compliant" appender는 다음과 같습니다.

  • AsyncAppender(org.apache.log4j2.AsyncAppender)는 이벤트를 비동기적으로 기록합니다. 이 appender는 이벤트를 수집하여 연결된 모든 부록에 전달합니다.
  • RewriteAppender(org.apache.log4j2.rewrite.RewriteAppender)는 로그 이벤트를 다시 작성한 후 다른 appender로 로그 이벤트를 전달합니다.

이러한 종류의 appender는 appender 정의에서 appenders 속성을 허용합니다.

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

예를 들어 async 라는 Async 및 비동기적으로 로그 이벤트를 JMS appender에 디스패치하는 AsyncAppender를 생성할 수 있습니다.

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

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

19.1.4.4. 오류 처리기

경우에 따라 appender가 실패할 수 있습니다. 예를 들어 RollingFileAppender 는 파일 시스템에 작성하려고 하지만 파일 시스템이 가득거나 JMS appender가 메시지를 전송하려고 하지만 JMS 브로커를 사용할 수 없습니다.

로그 appender가 실패하는지 확인하는 것이 중요하므로 로깅이 중요할 수 있습니다.

각 로그 appender는 오류 처리기에 오류 처리를 위임하여 appender 오류에 대응할 수 있는 기회를 제공합니다.

  • CryostatAppender(org.apache.log4j2.varia.FailoverAppender)를 사용하면 기본 추가 기능이 실패할 경우 보조 첨부자가 대신할 수 있습니다. 오류 메시지가 System.err 에 출력되고 보조 첨부 파일에 기록됩니다.
참고

Cryostat Appender에 대한 자세한 내용은 Log4j2의 Apppender 페이지로 이동합니다.

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]

19.1.4.5. OSGi 특정 MDC 속성

라우팅 부록 은 MDC(Mapped Diagnostic Context) 속성을 기반으로 로그 이벤트를 분할할 수 있는 OSGi 지향 appender입니다.

MDC를 사용하면 다양한 로그 이벤트 소스를 구분할 수 있습니다.

라우팅 appender는 기본적으로 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.6. 향상된 OSGi 스택 추적 렌더러

기본적으로 Apache Karaf는 특정 스택 추적 렌더러를 제공하여 일부 OSGi 특정 정보를 추가합니다.

스택 추적에서 예외를 throw하는 클래스 외에도 각 스택 추적 라인 끝에 [id:name:version] 패턴을 찾을 수 있습니다.

  • 번들 ID입니다.
  • 번들 이름입니다.
  • version 은 bundle 버전입니다.

문제의 원인을 진단하는 것이 매우 유용합니다.

예를 들어 다음 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.7. 사용자 정의 appender

Apache Karaf에서 고유한 appender를 사용할 수 있습니다.

가장 쉬운 방법은 appender를 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

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.