2016-11-11 9 views
1

Oracle SOA Suite用のカスタムlog4j2ロガーの開発中です。 クラスは、ファットまたは自己完結型のjarです。 これは、JUnitテストを実行する場合は、予想通り、ロガーがjsonlogger.jsonファイルへの書き込み Oracle SOA Suiteのカスタム・ロガーが間違ったファイルにログ記録する

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="error" name="JSONLogger"> 

<Properties> 
    <Property name="log-path">/var/tmp</Property> 
</Properties> 

<Appenders> 
    <Console name="Console" target="SYSTEM_OUT" level="FATAL"> 
     <PatternLayout pattern="%m%n" /> 
    </Console> 

    <RollingRandomAccessFile name="RollingFile" fileName="${log-path}/jsonlogger.json" 
       filePattern="${log-path}/%d{yyyyMMdd}_jsonlogger-%i.json" 
       immediateFlush="false"> 
     <PatternLayout> 
      <pattern>%m%n</pattern> 
     </PatternLayout> 

     <Policies> 
      <TimeBasedTriggeringPolicy /> 
      <SizeBasedTriggeringPolicy size="10 MB" /> 
     </Policies> 
     <DefaultRolloverStrategy max="4"/> 
    </RollingRandomAccessFile> 
    <Async name="Async"> 
    <AppenderRef ref="RollingFile"/> 
    </Async> 
</Appenders> 
<Loggers> 
    <Logger name="JSONLogger" level="trace" additivity="false"> 
     <AppenderRef ref="Async" /> 
    </Logger> 
    <Root level="fatal"> 
     <AppenderRef ref="Console" /> 
    </Root> 
</Loggers> 

ロガーとlog4j2.xml設定ファイルを持っており、アペンダ。

私のweblogicサーバーでは、log4j2.xml構成ファイルをデプロイし、log4j2.xmlファイルの場所にjavaプロパティーlog4j.configurationFileを設定しました。 Weblogic 12cサーバーにjarをデプロイすると、フォールトポリシーから呼び出されたときにロガーが正常に動作します。それだけが間違ったファイルに記録しています。

それはlog4j2設定で指定されたJSONファイルにする代わりに、このの

<Nov 11, 2016, 5:18:34,278 PM CET> <Error> <JSONLogger> <BEA-000000> <{"LOB":"*** TEST ****","Service":"B","Proces":"C","OptionalFields":{"melding":"Service unavailable for not available for a prolonged period","FaultPolicyID":"RemoteFaults","FaultType":"bpel","Partnerlink":"SimpleSyncUnavail","PortType":"{http://xmlns.oracle.com/JSONLogger/reddippedSimpleUnavail/BPELProcess}BPELProcess"},"level":"ERROR","thread_name":"[ACTIVE] ExecuteThread: '58' for queue: 'weblogic.kernel.Default (self-tuning)'","class":"com.reddipped.jsonlogger.JSONLogger","logger_name":"JSONLogger","@timestamp":"2016-11-11 17:18:34.270+0100"}> 

ファイルのWebLogic診断にこれを記録します

{"LOB":"*** TEST ****","Service":"B","Proces":"C","OptionalFields":{"melding":"Service unavailable for not available for a prolonged period","FaultPolicyID":"RemoteFaults","FaultType":"bpel","Partnerlink":"SimpleSyncUnavail","PortType":"{http://xmlns.oracle.com/JSONLogger/reddippedSimpleUnavail/BPELProcess}BPELProcess"},"level":"ERROR","thread_name":"[ACTIVE] ExecuteThread: '58' for queue: 'weblogic.kernel.Default (self-tuning)'","class":"com.reddipped.jsonlogger.JSONLogger","logger_name":"JSONLogger","@timestamp":"2016-11-11 17:18:34.270+0100"} 

だから、おそらく/設定/ fmwconfigで定義されたODL-ロガー/servers//logging.xmlが使用されます。

これをデバッグ/解決する方法はありますか?

- アップデート1 -

私は、正しい設定ファイルを使用したフォルト・ポリシーから実行したときに、実行時にかどうかを判断するために、いくつかのデバッグ文を追加しました。

try { 
System.out.println("**PNE** CLASS LOGGER PATH " + LOGGER.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()) ; 
} catch (Exception e) { 
    System.out.println("**PNE** CLASS LOGGER PATH FAiled") ; 
} 
System.out.println("**PNE** Config Location : " + org.apache.logging.log4j.core.LoggerContext.getContext().getConfiguration()) ; 
Map<String, Appender> appenders = org.apache.logging.log4j.core.LoggerContext.getContext().getConfiguration().getAppenders() ; 
for (String appender : appenders.keySet()) { 
    System.out.println("**PNE** APPENDER " + appender); 
    System.out.println("**PNE** APPENDER " + appenders.get(appender).toString());   
} 
System.out.println("**PNE** SYSTEM PROPERTY " + System.getProperty("log4j.configurationFile")) ; 

System.out.println("**PNE** :-) JSONLogger DEBUG " + lob + ":" + service + ":" + proces) ; 
LOGGER.error() 
.field("LOB", lob) 
.field("Service",service) 
.field("Proces", proces) 
.map("OptionalFields", optionalFields).log() ; 

予想されるlog4j構成ファイルが実際にロードされ、アペンダーがロガーコンテキストから取得されます。

**PNE** Config Location : XmlConfiguration[location=/u01/data/domains/soa12c/log4j2.xml] 
**PNE** APPENDER RollingFile 
**PNE** APPENDER RollingFile 
**PNE** APPENDER Async 
**PNE** APPENDER Async 
**PNE** APPENDER Console 
**PNE** APPENDER Console 
**PNE** SYSTEM PROPERTY /u01/data/domains/soa12c/log4j2.xml 
**PNE** :-) JSONLogger DEBUG Unknown:Unknown:Unknown 
<Nov 12, 2016, 10:00:40,184 AM CET> <Error> <JSONLogger> <BEA-000000> <{"LOB":"Unknown","Service":"Unknown","Proces":"Unknown","OptionalFields":{"melding":"Service unavailable for not available for a prolonged period","FaultPolicyID":"RemoteFaults","FaultType":"bpel","Partnerlink":"SimpleSyncUnavail","PortType":"{http://xmlns.oracle.com/JSONLogger/reddippedSimpleUnavail/BPELProcess}BPELProcess"},"level":"ERROR","thread_name":"[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'","class":"com.reddipped.jsonlogger.JSONLogger","logger_name":"JSONLogger","@timestamp":"2016-11-12 10:00:40.184+0100"}> 
**>>PNE** JSONLOGGERUnknownUnknownUnknownUnknown{melding=Service unavailable for not available for a prolonged period, FaultPolicyID=RemoteFaults, FaultType=bpel, Partnerlink=SimpleSyncUnavail, PortType={http://xmlns.oracle.com/JSONLogger/reddippedSimpleUnavail/BPELProcess}BPELProcess} 

困ったことは、実際のログ記録がまだ診断ログに記録されているということです。

- 更新2 -

ロギングは先に述べたように、診断ログに送信されますが、server.outファイルにされていません。したがって、log4jロギングはロガーの代わりにコンソールにルーティングされているようです。

log4j2.xmlにエラーがあり、コンソールアペンダーに不正な属性「レベル」が含まれていました。これを削除すると、ファイル/var/tmp/jsonlogger.jsonが作成されますが、空のままです。ログはまだserver.outに送信されます。

- 更新3 -

ロギングは7月に傍受されていること、それはだろうか?もしそうなら、私はそれが傍受されているかどうかを判断することができますか?

答えて

1

SLF4Jは、含まれている依存関係の1つによって抽象化をロギングするために使用されました。 Oracle SOA Suite 12cにはすでにクラスパスにSLF4Jバインディングがあります。 SLF4J APIは、1つのロギングフレームワークのみとバインドするように設計されています。 Oracle SOA SuiteはSLF4Jバインディングを使用しているため、独自のバインディングでSLF4jを使用する可能性はありませんでした。

私はSLF4Jの柔軟性を必要としないので、私のプロジェクトからSLF4J実装を削除し、抽象化レイヤーなしでlog4j2を使用しました。

関連する問題