環境:Weblogicの12.2 .1 ロギングフレームワーク:SLF4JとLogback 要件:要件を満たしていなかったweblogic.xmlの<prefer-application-packages/>
か<prefer-web-inf-classes>
を使用する(アプリケーションごとに)私が選んだのファイルと同様に、WebLogic Serverのログ
にログインします。私のテストでは、どちらか一方のタグを使用して(両方を使用することはできません)、アプリケーションlogback.xmlが取得され、ログはlogback.xmlに定義されたファイルに送られます。ただし、LogbackのConsoleAppenderを使用した標準的なSTDOUT定義では、サーバーログに記録されません。
<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>
Weblogic 12.2.1にバンドルされているSLF4jバインディングを使用すると、Java Utilのログになります。この場合、ログ・ステートメントはサーバー・ログに送られ、アプリケーション・レベルlogback.xmlのファイル定義には送られません。私の研究では、Weblogic 12の一部のバージョンでは内部SLF4jがLog4jにバインドされていましたが、マイナーリリースのいずれかで削除されていました。これは私の場合でした。管理コンソールからLog4jをWeblogicのプライマリログフレームワークとして有効にするオプションがありませんでした。私はこれが私を助けてくれないだろうと確信していますが、私が読んだいくつかの書類にはこれが利用可能であることが示されているので、注意する必要がありました。
weblogic.xml、POM(除外など)の設定、さまざまなバインディングとブリッジの使用を検討した結果、私は必要なロギング設定を達成できませんでした。 Weblogicのslf4jは、Javaユーティリティのログにバインドされているようです。独自のslf4j実装とバインディング(私の場合はLogback)を選択した場合、コンフィグレーションを通じてこれらのメッセージをWeblogicサーバのログにルーティングする方法はありません。 slf4jには1つのバインディングしか存在できませんが、多くのフレームワークはその1つのバインディングにルーティングできます(this図が役に立ちました)。Weblogic 12.2.1はJavaのロギングバインディングのみを使用します。アプリケーション構成レベル)を使用してWeblogicに接続し、サーバーログに記録するために提供するLogbackバインディングを使用します。これを達成するためにlog4jとブリッジを使用する方法があるかもしれませんが、私にとっては単純なロギング作業を達成するにはそれが非常に膨らんで構成されています。
設定でこれを克服しようと思いついたので、ログ記録イベントをJULログイベントに変換する独自のログバックアペンダーを作成することにしました。多くのLogbackの例に見られる標準STDOUTの定義をLogbackのAppenderBaseのown実装に置き換えました。この時点で、アプリケーションごとのログ設定を使用してログを記録し、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が自動的にSLF4Jへの橋渡しなるJbossLoggingが付属していることをここで注意してください)
<?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>
がうまくいけば、私は他の人に私は私が望んでいたこの作業方法を取得しようとして行った痛みの一部を保存することができます。
どのように、どのファイルを使用する必要があるかを説明すると非常に明確です。ありがとうございました! – ferreirabraga