Umwelt: Weblogic 12.2 .1 Protokollierung Framework: SLF4J und Logback Voraussetzung: Melden Sie sich in eine Datei meiner Wahl (pro Anwendung) sowie Weblogic Server-Logs
die <prefer-application-packages/>
oder <prefer-web-inf-classes>
in weblogic.xml Verwendung nicht die Anforderung erfüllen. In meinen Tests führt die Verwendung des einen oder anderen Tags (Sie können beide nicht verwenden) dazu, dass die Anwendung logback.xml aufgerufen wird und die Protokollierung in die in logback.xml definierte Datei wechselt. Die typische STDOUT-Definition, die ConsoleAppender von Logback verwendet, wird jedoch nicht in den Serverprotokollen protokolliert.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Entfernen Sie die folgenden von Weblogic.xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
führt das gebündelte SLF4J sich mit der Bindung, die in Weblogic 12.2.1, Java Util Logging ist. In diesem Fall werden Protokollanweisungen an die Serverprotokolle und nicht an die Dateidefinition in der Anwendungsebene logback.xml gesendet. In meinen Nachforschungen scheint es zu einer Zeit zu sein, dass einige Versionen von Weblogic 12 es erlaubten, das interne SLF4j an Log4j zu binden, wurde aber in einem der kleineren Releases entfernt. Das war mein Fall; Ich hatte nicht die Möglichkeit, Log4j als primäres Logging-Framework in Weblogic über die Admin-Konsole zu aktivieren. Ich bin mir ziemlich sicher, dass mir das nicht geholfen hätte, aber ich wollte es notieren, weil mehrere Dokumente, die ich gelesen habe, darauf hinweisen, dass dies verfügbar wäre.
Nach viel Forschung und Bekämpfung Konfiguration mit weblogic.xml, Konfiguration von POM (Ausschlüsse usw.) und versuchen, verschiedene Bindungen und Brücken zu verwenden, konnte ich nicht erreichen, die Protokollierungskonfiguration, die ich wollte. Es scheint, dass Sllf4j von Weblogic an die Protokollierung von Java-Utilities gebunden ist, ob nun besser oder schlechter. Wenn Sie Ihre eigene Implementierung von slf4j und binding (in meinem Fall Logback) wählen, gibt es keine Möglichkeit, diese Nachrichten über die Konfiguration an Weblogic-Serverprotokolle weiterzuleiten. Es kann nur eine Bindung in slf4j geben, und obwohl viele Frameworks zu dieser einen Bindung geroutet werden können (Ich fand this Diagramm nützlich) Weblogic 12.2.1 verwendet nur Java-Util-Logging-Bindung, gibt es keine Möglichkeit (auf der Anwendungskonfigurationsebene) um Weblogic so zu verkabeln, dass die Logback-Bindung verwendet wird, die Sie für die Protokollierung der Serverprotokolle bereitstellen. Es könnte eine Möglichkeit geben, log4j und Bridges zu verwenden, um dies zu erreichen, aber für mich ist das zu viel Aufblähung und Konfiguration, um eine einfache Protokollierungsaufgabe zu erledigen.
Nachdem ich aufgegeben habe, dies durch Konfiguration zu erobern, habe ich beschlossen, einfach meinen eigenen Logback-Appender zu schreiben, der ein Logging-Ereignis in ein JUL-Logging-Ereignis übersetzt. Ich habe die standardmäßige STDOUT-Definition, die in vielen Logback-Beispielen zu sehen ist, durch meine own Implementierung von Logbacks AppenderBase ersetzt. An dieser Stelle kann ich jetzt mit der Konfiguration der Anwendungsprotokollierung und der Protokollierung im Weblogic Server-Protokoll protokollieren. Abhängigkeiten
Relevante 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 (Man beachte hier, dass Hibernate mit JbossLogging kommt, die automatisch SLF4J überbrückt)
<?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 Implementierung
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 Konfiguration
<?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>
Hoffentlich kann ich andere einige der Schmerzen speichern, die ich durch den Versuch ging diese Arbeit den Weg zu bekommen ich wollte.
Es ist sehr klar, wenn Sie erklären, wie und welche Datei verwendet werden muss. Vielen Dank! – ferreirabraga