Mule ESB和Log 4J2路由选择器

时间:2015-02-17 21:02:08

标签: mule esb log4j2

我正在从AnyPoint Studio对Mule应用程序运行测试,并使用JUnit对测试进行编码。我需要能够很好地将日志数据整齐地捕获到每个测试的一个日志文件中......

我创建了一个Routing Appender,可以很好地直接对我们的日志记录组件进行测试(使用AnyPoint 5.0.1附带的log4j2)。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns:xi="http://www.w3.org/2001/XInclude">
    <properties>
        <property name="MULE_HOME">E:/</property>
        <property name="APP_NAME">A_MULE_APP</property>
    </properties>

    <Appenders>
        <Console name="stdout" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </Console>
        <RollingFile name="MyLog2"
            fileName="${MULE_HOME}/logs/applogs/LOG-${A_MULE_APP}.log"
            filePattern="${MULE_HOME}/logs/applogs/LOG-${A_MULE_APP}_%d{yyyyMMdd}.log">
            <PatternLayout pattern="%m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>      
        <!-- Messages from standard java or mule logging -->
        <RollingFile name="other"
            fileName="${MULE_HOME}/logs/applogs/SYS-${A_MULE_APP}.log"
            filePattern="${MULE_HOME}/logs/applogs/SYS-${A_MULE_APP}_%d{yyyyMMdd}.log">
            <PatternLayout pattern="%-5p %d [%t] %c: %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
        <Routing name="RoutingAppender">
            <Routes pattern="$${ctx:filename}">
                <Route>
                    <File name="File"
                        fileName="${ctx:filename}"
                        filePattern="${ctx:filename}.%i.log.gz">
                        <PatternLayout pattern="%m%n" />
                        <Policies>
                            <TimeBasedTriggeringPolicy />
                        </Policies>
                    </File>
                </Route>
                <Route ref="MyLog2" key="${ctx:filename}"/>
            </Routes>
        </Routing>      
    </Appenders>
    <Loggers>
        <Logger name="com.mylogging" level="INFO" additivity="false">
            <AppenderRef ref="stdout" />
            <AppenderRef ref="RoutingAppender" />               
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="stdout" />
            <AppenderRef ref="other" />
        </Root>
    </Loggers>
</Configuration>

在我的测试代码中,我使用

    ThreadContext.put("ctx", "filename");

如果我从测试代码中调用记录器

    logger.info("this is some info");

然后将正确的信息发送到正确的文件中。我需要的是我们的日志记录组件将此信息写入文件..

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)


您是否有理由需要捕获文件中的测试日志?

内存中的字符串不够用吗?您可以在每个单独的测试中为记录器创建一个自定义Appender,写入StringBuffer,然后对结果字符串运行断言。

您需要创建自己的自定义Appender。 You can see how to do that here。之后你可以编写如下测试:

public void testBlaBla () {
   StringAppender a = createAppenderForTest("com.some.package.Class");
   objectToTest.methodThatDoesLogging();
   assertEquals(EXPECTED_LOG_LINE, a.getOutput());
}
public void createAppenderForTest(String loggerName) {
   StringAppender appender = StringAppender.createStringAppender(PATTERN);
   appender.addToLogger(loggerName, Level.INFO);
   appender.start();
}