Ambiente: Weblogic 12.2 .1 Registrazione Quadro: SLF4J e Logback Requisito: Accedere a un file di mia scelta (per applicazione), così come i log del server Weblogic
Utilizzando il <prefer-application-packages/>
o <prefer-web-inf-classes>
in weblogic.xml non soddisfa il requisito. Nei miei test, l'utilizzo di uno o degli altri tag (non è possibile utilizzare entrambi) comporterà il ritiro del logback.xml dell'applicazione e la registrazione verrà eseguita nel file definito in logback.xml. Tuttavia, la tipica definizione di STDOUT che utilizza ConsoleAppender di logback non effettuerà il log dei log del server.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Rimozione del seguente da weblogic.xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
comporterà utilizzando il bundle SLF4J vincolante, che in Weblogic 12.2.1, è la registrazione Java Util. In questo caso, le istruzioni del registro andranno ai log del server e non alla definizione del file nel livello logback.xml dell'applicazione. Nella mia ricerca, appare in una sola volta, alcune versioni di Weblogic 12 hanno permesso che l'SLF4j interno fosse associato a Log4j, ma è stato rimosso in una delle versioni minori. Questo era il mio caso; Non avevo la possibilità di abilitare Log4j come framework di registrazione primario in Weblogic tramite la Console di amministrazione. Sono abbastanza sicuro che questo non mi avrebbe aiutato, ma ho voluto prenderlo perché molti documenti che ho letto indicavano che questo sarebbe disponibile.
Dopo molte ricerche e configurazioni di combattimento con weblogic.xml, configurazione di POM (esclusioni ecc.) E tentativo di utilizzare diversi collegamenti e bridge, non sono riuscito a ottenere la configurazione di registrazione che volevo. Sembra che lo slf4j di Weblogic sia associato alla registrazione dell'utilità Java, nel bene o nel male. Se si sceglie la propria implementazione di slf4j e binding (nel mio caso Logback), non è possibile trovare per instradare quei messaggi ai log del server Weblogic attraverso la configurazione. Ci può essere solo un legame in slf4j, e anche se molti framework possono essere indirizzati a quel binding, (ho trovato utile il diagramma this) Weblogic 12.2.1 utilizza solo l'associazione Java logging, non c'è modo di (a livello di configurazione dell'applicazione) per collegare Weblogic per utilizzare l'associazione Logback fornita per accedere ai relativi log del server. Ci potrebbe essere un modo per usare log4j e bridge per realizzare questo, ma per me è tutto troppo gonfio e configurazione per realizzare una semplice attività di logging.
Rinunciare a cercare di conquistare questo per la configurazione, ho deciso di scrivere semplicemente la mia appender logback che traduce un evento di registrazione in un evento di registrazione luglio Ho sostituito la definizione standard di STDOUT vista in molti esempi di logback con la mia implementazione own di AppenderBase di Logback. A questo punto posso ora effettuare il log utilizzando la configurazione di registrazione per applicazione e accedere al log del server Weblogic.
dipendenze POM rilevanti:
<!-- 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 (Si noti qui che Hibernate viene con JbossLogging che da ponte SLF4J automaticamente) attuazione
<?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;
}
}
}
configurazione 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>
Spero di poter salvare gli altri un po 'del dolore che ho passato cercando di ottenere questo lavoro nel modo che volevo.
È molto chiaro quando si spiega come e quale file è necessario utilizzare. Grazie! – ferreirabraga