Подтвердить что ты не робот

Sl4j/logback под weblogic

Я пытаюсь настроить sl4j/logback под Weblogic12. Я разворачиваю файл уха, у которого есть файл войны, в котором есть WEB-INF\classes\logback.xml
Вот конфигурация:      

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

</configuration>

Мой код для журнала:

private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class);
//......
logger.info("info test");
logger.debug("debug test");
logger.error("error test");

Что я вижу в стандартном выходе:

ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
INFO: info test
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
SEVERE: error test

Итак, похоже, что файл конфигурации не выбран. Что я делаю не так?

4b9b3361

Ответ 1

Проблема заключалась в том, что sl4j не забирал logback и вместо этого использовал loglog для slf4j-jdk. Может быть исправлено с помощью Weblogic config weblogic-application.xml, опции предпочитают-приложения-пакеты

Ответ 2

Проблема здесь подробно обсуждается: https://stagingthinking.wordpress.com/2012/06/02/annoying-slf4j-problem-in-weblogic-server-12c/

Точный пакет, который вам нужно поставить в механизм prefer-application-packages, составляет org.slf4j, например:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application>
  <prefer-application-packages>
    <package-name>org.slf4j</package-name>
  </prefer-application-packages>
</weblogic-application>

Ответ 3

Примечание: Также этот вопрос уже ответил, я хочу добавить, что вы также должны добавить prefer-application-resources.

Ответ: Добавьте к уху файл META-INF/weblogic-application.xml, содержащий как prefer-application-packages, так и prefer-application-resources!

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application
        xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd"
        version="6">

    <!-- http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm -->
    <prefer-application-packages>
        <package-name>org.slf4j.*</package-name>
    </prefer-application-packages>


    <!-- if not using prefer-application-resources you will get a warning like this: -->
    <!-- Class path contains multiple SLF4J bindings -->
    <!-- SLF4J: Found binding in [jar:file:/C:/wls1211/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] -->
    <prefer-application-resources>
        <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
    </prefer-application-resources>


</weblogic-application>

Ответ 4

Альтернативно, или если у вас есть проблемы с более чем slf4j, вы можете использовать

<wls:container-descriptor>
    <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>

Вместо

<prefer-application-packages>
    <package-name>org.slf4j.*</package-name>
</prefer-application-packages>

Источник: Oracle

Ответ 5

Окружающая среда: Weblogic 12.2.1 Структура регистрации: Slf4j и Logback Требование: войдите в файл по моему выбору (для каждого приложения), а также журналы сервера Weblogic

Использование <prefer-application-packages/> или <prefer-web-inf-classes> в weblogic.xml не удовлетворяло требованию. В моем тестировании, используя те или иные теги (вы не можете использовать их оба), будет вызван захват приложения logback.xml, и регистрация будет идти в файл, определенный в logback.xml. Однако типичная ошибка STDOUT, использующая logback ConsoleAppender, не будет регистрироваться в журналах сервера.

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

Удаление из weblogic.xml

<wls:prefer-application-packages>
    <wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>

приведет к использованию связного связывания SLF4j, которое в Weblogic 12.2.1 является протоколом Java Util. В этом случае заявления журнала будут поступать на журналы сервера, а не на определение файла на уровне приложения logback.xml. В моих исследованиях, как представляется, некоторая версия Weblogic 12 позволила внутреннему SLF4j быть привязанным к Log4j, но была удалена в одном из младших выпусков. Это было мое дело; У меня не было возможности включить Log4j в качестве основной платформы ведения журнала в Weblogic через консоль администратора. Я уверен, что это не помогло бы мне, но я хотел бы отметить это, потому что несколько документов, которые я читал, показывают, что это будет доступно.

После долгих исследований и борьбы с конфигурацией с weblogic.xml, конфигурацией POM (исключений и т.д.) и попыткой использовать разные привязки и мосты, мне не удалось найти конфигурацию ведения журнала, которую я хотел. Похоже, что Weblogic slf4j привязан к ведению журналов Java, к лучшему или к худшему. Если вы выберете собственную реализацию slf4j и привязки (в моем случае Logback), я не смог найти способ перенаправить эти сообщения в журналы сервера Weblogic через конфигурацию. В slf4j может быть только одно связывание, и хотя многие фреймворки могут быть перенаправлены на одну привязку (я нашел эту диаграмму полезной) Weblogic 12.2.1 использует только привязку привязки Java util, нет способа (на уровне конфигурации приложения) подключить Weblogic для использования привязки журнала, которую вы предоставляете для входа в журналы своего сервера. Возможно, какой-то способ использовать log4j и мосты для этого, но для меня это слишком много раздутия и конфигурации для выполнения простой задачи регистрации.

Отказавшись от попыток завоевать эту конфигурацию, я решил просто написать свой собственный приложение logback, которое переводит событие регистрации в событие регистрации JUL. Я заменил стандартное определение STDOUT, увиденное во многих примерах журнала, с моей собственной реализацией Logback AppenderBase. На этом этапе я могу теперь вести журнал, используя конфигурацию регистрации приложений, а также регистрироваться в журнале веб-журнала.

Соответствующие зависимости POM:

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>

weblogic.xml(обратите внимание, что Hibernate поставляется с JbossLogging, который автоматически соединяется с slf4j)

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd">
<jsp-descriptor>
    <keepgenerated>true</keepgenerated>
    <debug>true</debug>
</jsp-descriptor>
<context-root>YourContextRoot</context-root>
<wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>ch.qos.logback.*</wls:package-name>
        <wls:package-name>org.jboss.logging.*</wls:package-name>
        <wls:package-name>org.slf4j.*</wls:package-name>
    </wls:prefer-application-packages>
    <wls:prefer-application-resources>
        <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
    </wls:prefer-application-resources>
</wls:container-descriptor>

Внедрение Резервирования AppenderBase

import java.util.logging.Logger;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;

public class WeblogicAppender extends AppenderBase<ILoggingEvent> {

private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName());
ILoggingEvent event = null;

@Override
protected void append(ILoggingEvent event) {
    this.event = event;
    logger.log(getJULLevel(), event.getFormattedMessage());
}

private java.util.logging.Level getJULLevel() {

    if (this.event == null) {
        return java.util.logging.Level.SEVERE;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) {
        return java.util.logging.Level.ALL;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) {
        return java.util.logging.Level.FINE;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) {
        return java.util.logging.Level.SEVERE;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) {
        return java.util.logging.Level.INFO;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) {
        return java.util.logging.Level.FINEST;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) {
        return java.util.logging.Level.WARNING;
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) {
        return java.util.logging.Level.OFF;
    } else {
        return java.util.logging.Level.INFO;
    }
}

}

Конфигурация Logback.xml

<?xml version="1.0" encoding="UTF-8"?>
 <configuration>
<appender name="STDOUT" class="com.your.package.WeblogicAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
    </encoder>
</appender>
<appender name="FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>yourlog.log
    </file>
    <rollingPolicy
        class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <maxFileSize>25MB</maxFileSize>
        <maxHistory>60</maxHistory>
        <totalSizeCap>10GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
    </encoder>
</appender>

<root level="TRACE">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>
</configuration>

Надеюсь, я смогу спасти других от боли, с которой я столкнулся, пытаясь заставить это работать так, как я хотел.