sl4j / logback под weblogic
Я пытаюсь настроить sl4j / logback под Weblogic12.
Я развертываю файл ear, который имеет файл war, который имеет WEB-INFclasseslogback.в 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
Итак, похоже, что файл конфигурации не подобран. Что я делаю не так?
5 ответов
проблема обсуждается здесь подробно: 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>
Примечание: также на этот вопрос уже ответили, хочу добавить, что вы также должны добавить 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>
проблема заключалась в том, что-sl4j не взял logback и вместо этого использовал журнал slf4j-jdk Weblogic. Можно исправить с помощью конфигурации Weblogic weblogic-приложение.в XML, вариант prefer-application-packages
альтернативно или если у вас есть проблемы с более чем 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
Окружающая Среда: Weblogic 12.2.1 Рамки ведения журнала: Slf4j и Logback Требование: войдите в файл по моему выбору (для каждого приложения), а также журналы WebLogic server
С помощью <prefer-application-packages/>
или <prefer-web-inf-classes>
в weblogic.xml не удовлетворяет этому требованию. В моем тестировании использование одного или других тегов (вы не можете использовать оба) приведет к обратному входу приложения.xml, который нужно забрать, и ведение журнала перейдет в файл, определенный в logback.XML. Однако типичный STDOUT определение с помощью ConsoleAppender logback не будет входить в журналы сервера.
<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. В этом случае операторы log перейдут к журналам сервера, а не к определению файла в logback уровня приложения.XML. В моем исследовании, кажется, в свое время, некоторая версия Weblogic 12 позволила внутреннему SLF4j быть привязан к Log4j, но был удален в одном из второстепенных выпусков. Это был мой случай; у меня не было возможности включить Log4j в качестве основной структуры ведения журнала в Weblogic через консоль администратора. Я почти уверен, что это не помогло бы мне, но я хотел отметить это, потому что несколько документов, которые я прочитал, указывали, что это будет доступно.
После много исследования и воюя конфигурации с weblogic.xml, конфигурация POM (исключения и т. д.) и попытка использовать различные привязки и мосты, я не смог достичь конфигурации ведения журнала, которую я хотел. Похоже, что slf4j Weblogic привязан к журналу утилиты Java, к лучшему или худшему. Если вы выберете свою собственную реализацию slf4j и привязку (в моем случае Logback), я не смогу найти способ направить эти сообщения в журналы Weblogic server через конфигурацию. В slf4j может быть только одна привязка, и хотя многие фреймворки могут быть направлены на эту привязку, (я нашел этой диаграмма полезно) Weblogic 12.2.1 использует только Java util logging binding, нет никакого способа (на уровне конфигурации приложения) подключить Weblogic к использованию привязки Logback, которую вы предоставляете для входа в свои журналы сервера. Для этого может быть какой-то способ использовать log4j и мосты, но для меня это слишком много раздувания и конфигурации для выполнения простой задачи ведения журнала.
отказавшись от попытки победить это по конфигурации, я решил просто написать свой собственный logback appender, который преобразует событие ведения журнала в событие ведения журнала JUL. Я заменил стандартное определение STDOUT, увиденное во многих примерах Logback, на my собственные реализация AppenderBase Logback так же. На этом этапе я могу войти в систему, используя конфигурацию ведения журнала приложения, а также войти в журнал Weblogic Server.
соответствующие зависимости 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>
Logback так 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>
надеюсь, я смогу спасти других от боли, через которую я прошел, пытаясь заставить это работать так, как я хотел.