Статьи

Интегрируйте приложение Log4j Nagios в Apache Karaf / ServiceMix

Это, возможно, пост для довольно узкой аудитории.

Как известно пользователям ServiceMix / Karaf, платформа Pax Logging, используемая в Karaf , прекрасно интегрируется с Apache Log4J из коробки. На самом деле файл конфигурации ведения журнала Karaf, расположенный в etc / org.ops4j.pax.logging.cfg, использует синтаксис конфигурации Log4J.

Интеграция с Log4J происходит из коробки в Karad, пакет OSGi Pax Logging Service включает в себя основные классы Log4J, так что поддерживаются стандартные приложения Log4J. 

Сейчас есть множество дополнительных appenders для Log4J доступного (не исчерпывающий список здесь ). Одним из таких приложений является приложение Log4J Nagios , которое отправляет сообщения регистрации в Nagios (через сервер NSCA).

Я никогда раньше не использовал Nagios, но у меня была задача, чтобы заставить это приложение Nagios работать в Fuse ESB Enterprise 7.0.2 . Fuse ESB основан на Apache ServiceMix, поэтому изложенное решение применимо также к ServiceMix 4.x и Karaf.

Поскольку все было не так просто, я не тороплюсь, чтобы документировать свое решение, чтобы оно могло, надеюсь, сэкономить чужое время.

Чтобы установить и настроить Nagios, я запустил виртуальную машину Ubuntu и установил пакеты nagios и nsca, используя менеджер пакетов Ubuntu. Что касается настройки Nagios, я следовал этой статье и этому документу, объясняющему настройку сервера NSCA. Хотя у меня не было предыдущих знаний о Nagios, я настроил и запустил его в течение часа благодаря ссылочным статьям.

Возвращаясь к ServiceMix / Karaf. Приложение Nagios Log4J поставляется в виде простого файла JAR (не с OSGi). Возможная конфигурация Nagios Log4j приведена в конце этого поста.

Проблема в том, что ведение журнала осуществляется службой регистрации Pax в Карафе. Итак, как вы говорите системе pax-logging-service, что она также должна загружать приложение Nagios Log4J из другого файла JAR, развернутого в Karaf?
Возможно, есть и другие способы решения этой проблемы, но я нашел, что проще всего использовать концепцию OSGi.

В OSGi есть концепция расслоения фрагментов . Из OSGi Wiki :
«Пучок фрагмент , или просто фрагмент, — это пакет, содержимое которого доступно для другого пакета ( хоста фрагмента ). Важно отметить, что фрагменты разделяют загрузчик классов своего родительского пакета.

Важно отметить, что фрагменты используют загрузчик классов своего родительского или хост-пакета. 
Используя пакет фрагментов, вы можете расширять классы, которые могут быть загружены хост-пакетом, без необходимости изменить список импортируемых пакетов OSGi.

Что касается моего варианта использования, это означает: сделав jar-файл Nagios Lo4J фрагментным пакетом пакета Pax Logging Service, пакет Pax Logging Service сможет загружать классы приложения Nagios Log4J и отправлять отчеты о регистрации на сервер Nagios NSCA.

Jar Nagios Log4J не содержит метаданных OSGi, поэтому мне пришлось добавить их вручную. Я извлек jar-файл и изменил META-INF / MANIFEST.MF, чтобы он содержал эти заголовки.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_13-b03 (Sun Microsystems Inc.)
Bundle-Name: log4j-nagios
Bundle-SymbolicName: org.apache.log4j.nagios
Bundle-Version: 2.0.0
Bundle-ManifestVersion: 2
Fragment-Host: org.ops4j.pax.logging.pax-logging-service
Export-Package: org.apache.log4j.nagios;version="2.0.0"

Обратите внимание на заголовок Fragment-Host, он устанавливает хост для пакета OSGi службы pax-logging-service.
Кроме того, нет необходимости определять список Import-Package, так как все необходимые классы Log4J будут доступны хост-комплекту.

Затем я перестроил файл jar и назвал его log4j-nagios-appender-2.0.0.osgi.jar .
Если вы не хотите выполнять эти шаги вручную, вы можете скачать jar-файл с поддержкой OSGi, используя вышеуказанную ссылку.

Развернуть эту новую банку легко. Пожалуй, самая простая форма — начать с нового контейнера (без данных или с пустой папкой).
Предполагая, что файл etc / org.ops4j.pax.logging.cfg уже настроен для ведения журнала Nagios (см. Пример конфигурации ниже), вы можете просто скопировать log4j-nagios-appender-2.0.0.osgi.jar в папку ServiceMix deploy /ix и запустить ServiceMix.

Может возникнуть следующее исключение при первом запуске

java.lang.ClassNotFoundException: org.apache.log4j.nagios.NagiosAppender not found 

by org.ops4j.pax.logging.pax-logging-service [3]

Но вы можете игнорировать это. Поскольку пакет pax-logging-service был запущен до фрагмента пакета Nagios Log4J, Pax Logging не может загрузить приложение Nagios сразу при запуске. Однако, когда пакет фрагментов Nagios Log4J подключается к службе pax-logging, классы приложения Nagios будут загружены, и начнется регистрация через этого приложения. Сообщения будут отправлены на сервер NSCA.
При последующих перезапусках Karaf пакеты уже соединены вместе (т. Е. Служба pax-logging знает, что существует пакет фрагментов), поэтому это исключение больше не будет вызываться.

Надеюсь это поможет.

Пример конфигурации org.ops4j.pax.logging.cfg с использованием приложения Nagios:

################################################################################
#
#    Licensed to the Apache Software Foundation (ASF) under one or more
#    contributor license agreements.  See the NOTICE file distributed with
#    this work for additional information regarding copyright ownership.
#    The ASF 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.
#
################################################################################

# Root logger
log4j.rootLogger=INFO, out, osgi:* , NAGIOS
log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer

# CONSOLE appender not used by default
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

# File appender
log4j.appender.out=org.apache.log4j.RollingFileAppender
log4j.appender.out.layout=org.apache.log4j.PatternLayout
log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
log4j.appender.out.file=${karaf.data}/log/karaf.log
log4j.appender.out.append=true
log4j.appender.out.maxFileSize=1MB
log4j.appender.out.maxBackupIndex=10

# Sift appender
log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
log4j.appender.sift.key=bundle.name
log4j.appender.sift.default=karaf
log4j.appender.sift.appender=org.apache.log4j.FileAppender
log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
log4j.appender.sift.appender.append=true


# Nagios Log4J configuration
# ------------------------------------------------------------
# set the appender for Nagios
log4j.appender.NAGIOS=org.apache.log4j.nagios.NagiosAppender

# Nagios configurations
log4j.appender.NAGIOS.Host=192.168.178.44
log4j.appender.NAGIOS.Port=5667
log4j.appender.NAGIOS.ServiceNameDefault=FuseESB
log4j.appender.NAGIOS.MDCCanonicalHostNameKey=nagios_canonical_hostname


# It may be required to set a Nagios config file if non-default
# data encryption algorithms are used.
log4j.appender.NAGIOS.ConfigFile=/opt/fuse/SMX/fuse-esb-7.0.2.fuse-097/send_nsca.cfg

# mapping warning levels.
log4j.appender.NAGIOS.Log4j_Level_INFO=NAGIOS_OK
log4j.appender.NAGIOS.Log4j_Level_WARN=NAGIOS_WARN
log4j.appender.NAGIOS.Log4j_Level_ERROR=NAGIOS_CRITICAL
log4j.appender.NAGIOS.Log4j_Level_FATAL=NAGIOS_CRITICAL

# set the layout for appender Nagios
log4j.appender.NAGIOS.layout=org.apache.log4j.PatternLayout
log4j.appender.NAGIOS.layout.conversionPattern=server: %X{nagios_canonical_hostname}: %m%n