Środowisko: Weblogic 12.2 .1 Rejestrowanie Ramowa: slf4j i Logback Wymagania: Logowanie do pliku mojego wyboru (w przypadku stosowania), a także logi serwera Weblogic
Używanie <prefer-application-packages/>
lub <prefer-web-inf-classes>
w weblogic.xml nie spełnia wymogu. W moich testach użycie jednego lub drugiego znacznika (nie można użyć obu) spowoduje, że aplikacja logback.xml zostanie pobrana, a rejestracja przejdzie do pliku zdefiniowanego w logback.xml. Jednak typowe zdefiniowanie STDOUT przy użyciu logback's ConsoleAppender nie będzie logować się do logów serwera.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Usunięcie następujących elementów z weblogic.xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
spowoduje wykorzystanie powiązanego powiązania SLF4j, które w Weblogic 12.2.1 jest protokołem Java Util. W takim przypadku instrukcje dziennika będą przesyłane do dzienników serwera, a nie do definicji pliku na poziomie logback.xml aplikacji. W moich badaniach wydaje się, że w pewnym momencie, niektóre wersje Weblogic 12 pozwoliły wewnętrznemu SLF4j związać się z Log4j, ale zostały usunięte w jednym z mniejszych wydań. To był mój przypadek; Nie miałem możliwości włączenia Log4j jako podstawowej struktury logowania w Weblogic w konsoli administracyjnej. Jestem pewien, że to by mi nie pomogło, ale chciałem to zauważyć, ponieważ wiele dokumentów, które przeczytałem, wskazywało na to.
Po wielu badaniach i konfiguracji bojowej z weblogic.xml, konfiguracją POM (wykluczeniami itp.) I próbą użycia różnych wiązań i mostów, nie udało mi się osiągnąć wymaganej konfiguracji rejestrowania. Wygląda na to, że slf4j w Weblogic jest związany z logowaniem się do Java na lepsze lub gorsze. Jeśli wybierzesz własną implementację slf4j i bindowania (w moim przypadku Logback), nie ma możliwości, żebym mógł znaleźć te komunikaty do logów serwera Weblogic poprzez konfigurację. W slf4j może być tylko jedno wiązanie i chociaż wiele frameworków może być routowanych do tego wiązania, (znalazłem użyteczny diagram this) Weblogic 12.2.1 stosuje tylko logowanie logiczne Java, nie ma sposobu (na poziomie konfiguracji aplikacji) do połączenia Weblogic, aby użyć powiązania Logback, które podajesz, aby logować się do jego dzienników serwera. Może być jakiś sposób użycia log4j i mostów, aby to osiągnąć, ale dla mnie jest to za dużo za dużo i konfiguracja do wykonania prostego zadania rejestrowania.
Rezygnując z próby opanowania tego przez konfigurację, zdecydowałem się po prostu napisać mojego własnego dostawcę logback, który tłumaczy zdarzenie rejestrowania na zdarzenie rejestrowania JUL. Zastąpiłem standardową definicję STDOUT widoczną w wielu przykładach Logback z moją wersją own implementacji AppBookBase firmy Logback. W tym momencie mogę teraz logować za pomocą konfiguracji rejestrowania aplikacji, a także zalogować się do dziennika serwera Weblogic.
Istotne Zależności 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 (Zauważmy, że Hibernate wyposażony JbossLogging która będzie pomostem do automatycznego slf4j) realizację
<?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;
}
}
}
konfiguracja 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>
Mam nadzieję, że mogę ratować innych niektóre z bólem, że przeszedł próbując dostać tę pracę tak, jak chciałem.
Wyjaśnienie, w jaki sposób i jakiego pliku należy użyć, jest bardzo jasne. Dziękuję Ci! – ferreirabraga