19장. Maven Indexer 플러그인
Maven 플러그인에서 Maven Central이 아티팩트를 빠르게 검색할 수 있도록 하려면 Maven 플러그인에 필요합니다.
Maven Indexer 플러그인을 배포하려면 다음 명령을 사용합니다.
사전 요구 사항
Maven Indexer 플러그인을 배포하기 전에 Apache Karaf preparing to Use Maven 섹션의 지침을 따라야 합니다.
Maven Indexer 플러그인 배포
Karaf 콘솔로 이동하여 다음 명령을 입력하여 Maven Indexer 플러그인을 설치합니다.
features:install hawtio-maven-indexer
다음 명령을 입력하여 Maven Indexer 플러그인을 구성합니다.
config:edit io.hawt.maven.indexer config:proplist config:propset repositories 'https://maven.oracle.com' config:proplist config:update
Maven Indexer 플러그인이 배포될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. 로그 탭에 표시하려면 아래에 표시된 것과 같은 메시지를 확인합니다.
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의 수준을 사용하므로 my.logger
.customINFO
임을 의미합니다.
이제 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.custom
및 my.logger
모두 상위 rootLogger
의 로그 수준을 사용합니다.
rootLogger
와 함께 DEFAULT 키워드를 사용할 수 없으며 부모가 없습니다.
19.1.2.7. log:tail
log:tail
은 log: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를 사용할 수 있습니다.