【发布时间】:2016-11-11 16:53:21
【问题描述】:
我正在为 Oracle SOA 套件开发自定义 log4j2 记录器。 该类是一个胖或独立的罐子。 它有一个带有 logger 和 appender 的 log4j2.xml 配置文件
<?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"}
所以可能使用了 /config/fmwconfig/servers//logging.xml 中定义的 odl-logger。
有什么方法可以调试/解决这个问题?
-- 更新 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 配置文件,并且从 logger 上下文中检索了 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 确实包含错误,控制台附加程序具有非法属性“级别”。删除此文件后,文件 /var/tmp/jsonlogger.json 被创建,但保持为空。日志仍然发送到 server.out。
-- 更新 3--
会不会是日志被 JUL 拦截了?如果是,如何判断是否被拦截?
【问题讨论】:
标签: java xml logging log4j2 weblogic12c