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。