Oracle SOA套件中的自定义记录器记录到错误的文件

问题描述:

我正在开发Oracle SOA套件的自定义log4j2记录器。 该课程是一个脂肪或自包含的罐子。 它有一个记录器一个log4j2.xml配置文件和附加器Oracle SOA套件中的自定义记录器记录到错误的文件

<?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> 

当运行JUnit测试,如预期的记录写入jsonlogger.json文件。

在我的weblogic服务器上,我部署了log4j2.xml配置文件,并将java属性log4j.configurationFile设置为log4j2.xml文件的位置。 当我将jar部署到我的Weblogic 12c服务器时,记录器在从故障策略调用时工作正常。只有它记录到错误的文件。

它记录本到WebLogic诊断文件

<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"}> 

取而代之的是在log4j2配置中指定的JSON文件

{"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配置文件,并且会从记录器上下文中检索appender。

**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确实包含错误,控制台appender具有非法属性“level”。删除此文件后,创建/var/tmp/jsonlogger.json文件,但保留为空。记录仍然发送到server.out。

- 更新3 -

难道日志被截获JUL?如果是的话,我如何确定是否被拦截?

SLF4J被用作包含依赖项之一的日志抽象。 Oracle SOA Suite 12c在类路径中已经有一个SLF4J绑定。 SLF4J API旨在仅与一个日志记录框架绑定。由于Oracle SOA套件使用SLF4J绑定,因此我没有看到使用SLF4j与我自己的绑定的可能性。

因为我不需要SLF4J的灵活性,所以我从我的项目中删除了SLF4J实现,并在没有抽象层的情况下使用了log4j2。