【问题标题】:Custom logger in Oracle SOA Suite logging to wrong fileOracle SOA Suite 中的自定义记录器记录到错误文件
【发布时间】: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


    【解决方案1】:

    SLF4J 被包含的依赖项之一用于记录抽象。 Oracle SOA Suite 12c 的类路径中已经有一个 SLF4J 绑定。 SLF4J API 被设计为只绑定一个日志框架。因为 Oracle SOA Suite 使用 SLF4J 绑定,所以我没有看到将 SLF4j 与我自己的绑定一起使用的任何可能性。

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

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2015-02-13
      • 2015-01-16
      • 2020-01-12
      • 2019-11-12
      • 2013-01-09
      • 1970-01-01
      • 2016-11-04
      • 2023-03-12
      相关资源
      最近更新 更多